二维数据转扇形图像的通用算法:适用于雷达、B型超声等扇形扫描设备

举报
天元浪子 发表于 2021/07/26 22:30:10 2021/07/26
【摘要】 很久以前,帮一位在读硕士研究生写过一个B型超声设备的图像处理算法,顺便把思路记录整理后发了一篇博客。没想到这么冷门的一篇文章却经常被读者朋友翻出来,并留言希望我能帮助处理一些细节性的问题。深入了解之后才发现,原来雷达数据处理也面临同样的问题,都需要将二维的扇形扫描数据转成扇形图像,也就是实现下图所示的转换。 以上面这张雷达扫描图为例,完整的扇形图像生成代码如下...

很久以前,帮一位在读硕士研究生写过一个B型超声设备的图像处理算法,顺便把思路记录整理后发了一篇博客。没想到这么冷门的一篇文章却经常被读者朋友翻出来,并留言希望我能帮助处理一些细节性的问题。深入了解之后才发现,原来雷达数据处理也面临同样的问题,都需要将二维的扇形扫描数据转成扇形图像,也就是实现下图所示的转换。

在这里插入图片描述

在这里插入图片描述

以上面这张雷达扫描图为例,完整的扇形图像生成代码如下。

# -*- coding:utf-8 -*-

import os
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

def outimg(fn_squ, fn_fan, angle, r0=0, k=2, top=True,rotate=0): """将矩形图像转为环形 fn_squ - 输入文件名,不支持灰度图像文件 fn_fan - 输出文件名 angle - 环形夹角度数 r0 - 环形内圆半径,r0=0输出扇形 k - 临近点插值密度(如果图像上出现白噪点,可适当增加k值) top - 环心在上部 rotate - 旋转角度,正数表示逆时针旋转,负数表示顺时针旋转 """ im_pil = Image.open(fn_squ) # 打开输入图像 im = np.array(im_pil) # 转为NumPy数组 h, w, d = im.shape # 输入图像的高度、宽度和通道数 if r0 > 0: # 输出环形的话,图像上部增加白色背景 bg = np.ones((r0, w, d), dtype=np.uint8) im = np.append(bg, im, axis=0) if top else np.append(im, bg, axis=0) h, w, d = im.shape # 加上背景后图像的高度、宽度和通道数 r = 2*h-1  # 输出图像高度和宽度 im_fan = np.zeros((r, r, d), dtype=np.uint8) # 生成输出图像的numpy数组(全透明) idx = np.arange(h) if top else np.arange(h)[::-1] alpha = np.radians(np.linspace(-angle/2, angle/2, k*w)) # 生成扇形角度序列 for i in range(k*w): # 遍历输入图像的每一列 rows = np.int32(np.ceil(np.cos(alpha[i])*idx)) + r//2 cols = np.int32(np.ceil(np.sin(alpha[i])*idx)) + r//2 im_fan[(rows, cols)] = im[:,i//k] if 360 > angle > 180: # 裁切输出图像上部的空白区域 im_fan = im_fan[int(h*(1-np.sin(np.radians((angle/2-90))))):] if not top: im_fan = im_fan[::-1] im_out = Image.fromarray(im_fan, mode=im_pil.mode) if(os.path.exists(fn_fan)):#如果图像已存在就先删除 os.remove(fn_fan) im_out.save(fn_fan) # 保存为文件 #图像旋转(这个在正式工程中需要根据雷达图像起始(非转台起始角)的方位角来定) img = Image.open(fn_fan) dst = img.rotate(rotate) dst.save(fn_fan) print("图像已处理完并保存") # 绘图 plt.figure('B超扇扫', facecolor='#f4f4f4', figsize=(15, 7)) plt.subplot(121) plt.imshow(im) plt.subplot(122) plt.imshow(im_fan) plt.savefig('out_plt.png') plt.show() if __name__ == '__main__': outimg('demo.png', 'out.png', angle=180, r0=1, k=200, top=False)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66

文章来源: xufive.blog.csdn.net,作者:天元浪子,版权归原作者所有,如需转载,请联系作者。

原文链接:xufive.blog.csdn.net/article/details/118609098

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。