昨晚,有同学私信咨询:如何将矩形数据转为扇扫图像?面对这个问题,我也是一脸懵逼,什么是扇扫?矩形数据又是啥?细问之下,才知道这是B型超声设备的数据处理问题。B超输出的数据保存在一个二维数组中,但显示在屏幕上的却需要转换为扇形。如下图所示:

稍微思考一下,应该不难解决。比较直接的方法是,将二维数组的每一列旋转合适的角度,就可以拼成一副图像。我们用参数angle表示扇形夹角的一半,用参数k表示输出图像的高度与每一列数据数量的比值,很容易写出如下代码:

# -*- coding:utf-8 -*-import numpy as np
from PIL import Imagedef square2fan(fn_squ, fn_fan, angle=45, k=1):"""将矩形图像转为扇形fn_squ      - 输入文件名fn_fan      - 输出文件名angle       - 扇形夹角度数k           - 扇形因子,k大于1输出环形"""im = Image.open(fn_squ) # 打开输入图像为PIL对象mode = im.mode # 输入图像模式w, h = im.size # 输入图像分辨率rows, cols = int(np.ceil(h*k)), int(np.ceil(2*h*k*np.sin(np.radians(angle)))) # 输出图像高度和宽度cols += cols%2 # 宽度为单数则加1im_squ = np.array(im) # 输入图像转为numpy数组im_fan = np.zeros((rows, cols, im_squ.shape[2]), dtype=np.uint8) # 生成输出图像的numpy数组(全透明)alpha = np.radians(np.linspace(-angle, angle, w)) # 生成扇形角度序列,长度与输入图像宽度一致for i in range(w): # 遍历输入图像的每一列# 当前列各像素在输出图像上的行号d = np.cos(alpha[i])*rowslats = np.int_(np.linspace(d*(k-1)/k, d, h)).astype(np.int)# 当前列各像素在输出图像上的列号d = np.sin(alpha[i])*rowslons = np.int_(np.linspace(cols/2+d*(k-1)/k, cols/2+d, h)).astype(np.int)# 输出图像上对应的点替换为输入图像的点im_fan[(lats, lons)] = im_squ[:,i]# 保存为文件im = Image.fromarray(im_fan, mode=im.mode)im.save(fn_fan)if __name__ == '__main__':square2fan('demo.png', 'out.png', angle=45, k=1.0)

然而,输出图像的效果却不够完美:图像下部出现了镂空的白点。

没关系,我们再加上一个临近点插值,并用matplotlib将输入数据和输出数据画在一起。完整代码如下:

# -*- coding:utf-8 -*-import numpy as np
from PIL import Image
import matplotlib.pyplot as pltdef square2fan(fn_squ, fn_fan, angle=45, k=1):"""将矩形图像转为扇形fn_squ      - 输入文件名fn_fan      - 输出文件名angle       - 扇形夹角度数k           - 扇形因子,k大于1输出环形"""im = Image.open(fn_squ) # 打开输入图像为PIL对象mode = im.mode # 输入图像模式w, h = im.size # 输入图像分辨率rows, cols = int(np.ceil(h*k)), int(np.ceil(2*h*k*np.sin(np.radians(angle)))) # 输出图像高度和宽度cols += cols%2 # 宽度为单数则加1im_squ = np.array(im) # 输入图像转为numpy数组im_fan = np.zeros((rows, cols, im_squ.shape[2]), dtype=np.uint8) # 生成输出图像的numpy数组(全透明)alpha = np.radians(np.linspace(-angle, angle, w)) # 生成扇形角度序列,长度与输入图像宽度一致for i in range(w): # 遍历输入图像的每一列# 当前列各像素在输出图像上的行号d = np.cos(alpha[i])*rowslats = np.int_(np.linspace(d*(k-1)/k, d, h)).astype(np.int)# 当前列各像素在输出图像上的列号d = np.sin(alpha[i])*rowslons = np.int_(np.linspace(cols/2+d*(k-1)/k, cols/2+d, h)).astype(np.int)# 输出图像上对应的点替换为输入图像的点im_fan[(lats, lons)] = im_squ[:,i]# 空白区域临近点插值for row in range(int(rows*(k-1)/k)+1, rows):ps, pe = 0, 0for col in range(cols):if im_fan[row, col, 3] > 0:if ps == 0:ps, pe = col, colelse:pe = colfor col in range(ps-1 ,pe):if im_fan[row, col, 3] == 0:im_fan[row, col] = im_fan[row, col-1]# 绘图plt.figure('B超扇扫', facecolor='#f4f4f4', figsize=(15, 7))plt.subplot(121)plt.imshow(im_squ)plt.subplot(122)plt.imshow(im_fan)plt.savefig('out_plt.png')plt.show()# 保存为文件im = Image.fromarray(im_fan, mode=im.mode)im.save(fn_fan)if __name__ == '__main__':square2fan('demo.png', 'out.png', angle=35, k=1.2)

最终效果如下:

B型超声设备图像处理:用二维数据生成扇形图像相关推荐

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

    很久以前,帮一位在读硕士研究生写过一个B型超声设备的图像处理算法,顺便把思路记录整理后发了一篇博客.没想到这么冷门的一篇文章却经常被读者朋友翻出来,并留言希望我能帮助处理一些细节性的问题.深入了解之后 ...

  2. ArcGIS Pro如何实现已入库二维数据生成三维模型

    ArcGIS Pro如何实现已入库二维数据生成三维模型 二维要素是否带高程Z判断 如何判断要素是否带有高程Z信息 : 二维要素进行三维的展示 二维要素生成三维模型 常规状态下已入库的数据一般是二维的点 ...

  3. 【数据挖掘】K-Means 二维数据聚类分析 ( K-Means 迭代总结 | K-Means 初始中心点选择方案 | K-Means 算法优缺点 | K-Means 算法变种 )

    文章目录 K-Means 二维数据 聚类分析 数据样本及聚类要求 二维数据曼哈顿距离计算 K-Means 算法 步骤 第一次迭代 : 步骤 ( 1 ) 中心点初始化 第一次迭代 : 步骤 ( 2 ) ...

  4. Deep learning:十一(PCA和whitening在二维数据中的练习)

    前言: 这节主要是练习下PCA,PCA Whitening以及ZCA Whitening在2D数据上的使用,2D的数据集是45个数据点,每个数据点是2维的.参考的资料是:Exercise:PCA in ...

  5. QRCode二维码生成方案及其在带LOGO型二维码中的应用(2)

    QRCode二维码生成方案及其在带LOGO型二维码中的应用(2) 原文:QRCode二维码生成方案及其在带LOGO型二维码中的应用(2) 续前:QRCode二维码生成方案及其在带LOGO型二维码中的应 ...

  6. 以下关于python二维数据的描述中错误的是_关于二维数据CSV存储问题,以下选项中描述错误的是‪‪‪‪‪‪‫‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‫:...

    [单选题]C语言中最基本的数据类型包括( ). [单选题]计算机的性能可以用很多指标来衡量,除了用其运算速度.字长等指标以外,( )也作为主要指标. [单选题]Word2010文档文件的扩展名是( ) ...

  7. Python-深度学习-学习笔记(13):keras搭建卷积神经网络(对二维数据进行一维卷积)

    Python-深度学习-学习笔记(13):keras搭建卷积神经网络(对二维数据进行一维卷积) 卷积神经网络进行图像分类是深度学习关于图像处理的一个应用,卷积神经网络的优点是能够直接与图像像素进行卷积 ...

  8. QRCode二维码生成方案及其在带LOGO型二维码中的应用(1)

    提要:很多公司为商业宣传之需,常将企业LOGO加入二维码中,但如果LOGO遮挡区域足够地大,二维码就变得无法识别.那么,有没有一种办法将上述区域预先"抠空"出来(以便专门放置LOG ...

  9. QRCode二维码生成方案及其在带LOGO型二维码中的应用

    很多公司为商业宣传之需,常将企业LOGO加入二维码中,但如果LOGO遮挡区域足够地大,二维码就变得无法识别.那么,有没有一种办法将上述区域预先"抠空"出来(以便专门放置LOGO), ...

最新文章

  1. python 的回调函数
  2. 3.2.5 四则运算的例子
  3. IOS之UIToolBar约束报错
  4. linux-centos7 关机命令、系统目录结构介绍
  5. 福布斯发布2019最值得关注IoT公司榜单,全球化AI+IoT平台涂鸦智能上榜
  6. linux 百度云 备份软件下载,百度云存储api实现文件分享及linux下的备份上传
  7. 程序员如何才能跨过高级级别,譬如腾讯T3.1/阿里P7
  8. Ubuntu基础命令(五)--创建、复制、移动、删除
  9. python安卓app下载_【Python教学视频手机下载】Python教学app下载 v1.0 安卓版-趣致软件园...
  10. 一次量产恢复U盘真实容量的操作过程(安国主控芯片)
  11. 打包labview程序
  12. 产品经理面试(题目+答案)
  13. html菜鸟教程之HTML新手如何快速入门及HTML类的概述[图]
  14. netty报错 io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1
  15. 三防平板终端丨三防平板电脑丨三防平板如何应用在工业中?
  16. 【python教程入门学习】第一个Pygame程序
  17. STM32 HAL库 CUBEMX FPU 和 DSP库
  18. 如何安装ubuntu kylin(优麒麟)?
  19. 模仿淘宝web扫码登录
  20. vue+echart实现双柱状图

热门文章

  1. H5网络监听接口和全屏接口
  2. js、jq、实现全国省市级联
  3. 全球首次实现8K超高清电视直播和5G网络下的8K电视播出
  4. 小学有关计算机黑板报,计算机教室黑板报 [高中教室黑板报内容]
  5. 磁盘剩余容量不足解决办法
  6. 菜鸟学习----前端vue.js学习01
  7. 这个“杀手”逼迫BAT一年申请1.5万个商标
  8. 【endnote】在wps上使用Endnote--解决错误
  9. IO的端口映射和内存映射 (Port mapped I/O 和 Memory mapped I/O说明)
  10. random模块下的常用函数Python choices()方法练习