B型超声设备图像处理:用二维数据生成扇形图像
昨晚,有同学私信咨询:如何将矩形数据转为扇扫图像?面对这个问题,我也是一脸懵逼,什么是扇扫?矩形数据又是啥?细问之下,才知道这是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型超声设备图像处理:用二维数据生成扇形图像相关推荐
- 二维数据转扇形图像的通用算法:适用于雷达、B型超声等扇形扫描设备
很久以前,帮一位在读硕士研究生写过一个B型超声设备的图像处理算法,顺便把思路记录整理后发了一篇博客.没想到这么冷门的一篇文章却经常被读者朋友翻出来,并留言希望我能帮助处理一些细节性的问题.深入了解之后 ...
- ArcGIS Pro如何实现已入库二维数据生成三维模型
ArcGIS Pro如何实现已入库二维数据生成三维模型 二维要素是否带高程Z判断 如何判断要素是否带有高程Z信息 : 二维要素进行三维的展示 二维要素生成三维模型 常规状态下已入库的数据一般是二维的点 ...
- 【数据挖掘】K-Means 二维数据聚类分析 ( K-Means 迭代总结 | K-Means 初始中心点选择方案 | K-Means 算法优缺点 | K-Means 算法变种 )
文章目录 K-Means 二维数据 聚类分析 数据样本及聚类要求 二维数据曼哈顿距离计算 K-Means 算法 步骤 第一次迭代 : 步骤 ( 1 ) 中心点初始化 第一次迭代 : 步骤 ( 2 ) ...
- Deep learning:十一(PCA和whitening在二维数据中的练习)
前言: 这节主要是练习下PCA,PCA Whitening以及ZCA Whitening在2D数据上的使用,2D的数据集是45个数据点,每个数据点是2维的.参考的资料是:Exercise:PCA in ...
- QRCode二维码生成方案及其在带LOGO型二维码中的应用(2)
QRCode二维码生成方案及其在带LOGO型二维码中的应用(2) 原文:QRCode二维码生成方案及其在带LOGO型二维码中的应用(2) 续前:QRCode二维码生成方案及其在带LOGO型二维码中的应 ...
- 以下关于python二维数据的描述中错误的是_关于二维数据CSV存储问题,以下选项中描述错误的是:...
[单选题]C语言中最基本的数据类型包括( ). [单选题]计算机的性能可以用很多指标来衡量,除了用其运算速度.字长等指标以外,( )也作为主要指标. [单选题]Word2010文档文件的扩展名是( ) ...
- Python-深度学习-学习笔记(13):keras搭建卷积神经网络(对二维数据进行一维卷积)
Python-深度学习-学习笔记(13):keras搭建卷积神经网络(对二维数据进行一维卷积) 卷积神经网络进行图像分类是深度学习关于图像处理的一个应用,卷积神经网络的优点是能够直接与图像像素进行卷积 ...
- QRCode二维码生成方案及其在带LOGO型二维码中的应用(1)
提要:很多公司为商业宣传之需,常将企业LOGO加入二维码中,但如果LOGO遮挡区域足够地大,二维码就变得无法识别.那么,有没有一种办法将上述区域预先"抠空"出来(以便专门放置LOG ...
- QRCode二维码生成方案及其在带LOGO型二维码中的应用
很多公司为商业宣传之需,常将企业LOGO加入二维码中,但如果LOGO遮挡区域足够地大,二维码就变得无法识别.那么,有没有一种办法将上述区域预先"抠空"出来(以便专门放置LOGO), ...
最新文章
- mysql M/S配置小记
- 解放双手 | Jenkins + gitlab + maven 自动打包部署项目
- mysql免安装数据库用法_MySQL数据库之mysql免安装制作使用说明
- 构造、拷贝构造、赋值、析构
- JAVA面试常考系列五
- 国产统一操作系统(UOS)安装、体验
- 浅谈ORB-SLAM3
- Android-构建不同环境的Apk
- html+css+js实现关键词随机图片
- (转)C++中extern “C”含义深层探索
- C++ - dynamic_cast
- 基于51单片机数字电压表仿真设计_数码管显示
- u8系统怎么连接服务器,u8客户端如何连接服务器
- 爱思助手从苹果服务器shsh失败,爱思助手无法提取SHSH降级iOS6.1.2固件教程
- 基于51单片机的多路温度采集控制系统的设计
- 苹果新款手机ndows启动声音,苹果iphone手机不需其他APP即可自定义铃声教程
- PHP用户注册邮箱验证激活帐号
- js pug 代码_pug模板引擎(原jade)
- java 按钮添加音乐_如何使得java swing里加入的背景音乐 可用按钮控制播放与停止...
- 电子签名法学习-(1)电子认证服务机构