昨晚,有同学私信咨询:如何将矩形数据转为扇扫图像?面对这个问题,我也是一脸懵逼,什么是扇扫?矩形数据又是啥?细问之下,才知道这是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. mysql M/S配置小记
  2. 解放双手 | Jenkins + gitlab + maven 自动打包部署项目
  3. mysql免安装数据库用法_MySQL数据库之mysql免安装制作使用说明
  4. 构造、拷贝构造、赋值、析构
  5. JAVA面试常考系列五
  6. 国产统一操作系统(UOS)安装、体验
  7. 浅谈ORB-SLAM3
  8. Android-构建不同环境的Apk
  9. html+css+js实现关键词随机图片
  10. (转)C++中extern “C”含义深层探索
  11. C++ - dynamic_cast
  12. 基于51单片机数字电压表仿真设计_数码管显示
  13. u8系统怎么连接服务器,u8客户端如何连接服务器
  14. 爱思助手从苹果服务器shsh失败,爱思助手无法提取SHSH降级iOS6.1.2固件教程
  15. 基于51单片机的多路温度采集控制系统的设计
  16. 苹果新款手机ndows启动声音,苹果iphone手机不需其他APP即可自定义铃声教程
  17. PHP用户注册邮箱验证激活帐号
  18. js pug 代码_pug模板引擎(原jade)
  19. java 按钮添加音乐_如何使得java swing里加入的背景音乐 可用按钮控制播放与停止...
  20. 电子签名法学习-(1)电子认证服务机构

热门文章

  1. 【游戏建模全流程】使用Maya制作赛车模型
  2. 计算机网络方面的期刊,计算机网络或数据库方面论文有什么发表期刊
  3. 电脑如何高效工作——软件介绍
  4. Css效果之好看的边框颜色大全
  5. 数据库原理实验五——触发器与存储过程(函数)
  6. 升降横移式立体车库设计机械设计毕业设计全套资料
  7. 由筑智建提供技术支持的“2021年全国新职业技能大赛建筑信息模型技术员项目重庆市选拔赛”成功举行
  8. 课程设计任务分工说明、自评意见、自评等级、指导 教师 意见--基于java的进销存管理系统课程设计
  9. 怎么查看IP地址是否在同一网段
  10. Java制作超级玛丽