快速傅里叶变换凸显图像中的模糊的黑点(时域与频率的变换)_这个人不是画家的博客-程序员宅基地

技术标签: python  Halcon  

在很多情况下,我们需要检查出规则背景纹理下的深色点状的物质。但是由于背景纹理的影响,或者图片亮度不均匀,导致用普通的形态学分析很难达到目的。
那么,采用时域与频域之间进行变换的傅里叶变换(很多时候都会采用不包括振幅的相位变换的快速版本,即快速傅里叶变换,简称FFT,全称Fast Fourier Transform), 可以快速的凸显出不易发现的黑色点状像素点集。很多成熟的视觉算法库都会提供稳定且多样的傅里叶变换函数,比如OPENCV的有

np.fft.fft2
np.fft.fftshift
np.fft.ifftshift
np.fft.ifft2
f2_A = np.abs(f2shift) #取振幅
f2_P = np.angle(f2shift) #取相位

Halcon 的会有

rft_generic
convol_fft
fft_image
fft_image_inv

关于时域频域转换的傅里叶变换,教科书上有详细的理论推导,本文不再赘述。
那么本篇文章会以一个实例来验证快速傅里叶变换技术的高效与精准。
本实例采用Halcon编写,至于为什么用Halcon,是因为快速开发,变量可视化,哈哈哈哈哈。其实是我时间不够用,忙里偷闲写出了这一篇博客。
本文提供的用例照片如下:
原图是高清图片,不能上传,这是我截屏下来的。如果你们要用这张照片进行验证,把代码里的宽与高改成上面图片的宽与高即可。
本实例采用的一种负向的高斯带通滤波器,负向处理频域是为了凸显小黑点瑕疵,使它变成亮点,带通是为了提取图像中的边缘。
如果要说它的曲线的形状,应该是下面这样的。
在这里插入图片描述

以下为本实例用到的源代码。

dev_close_window ()
read_image (Image, '32.bmp')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 10, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (1)
*dev_set_color ('red')
* 
* Optimize the fft speed for the specific image size
optimize_rft_speed (Width, Height, 'standard')
* 
* Construct a suitable filter by combining two gaussian
* filters
Sigma1 := 10.0
Sigma2 := 3.0
gen_gauss_filter (GaussFilter1, Sigma1, Sigma1, 0.0, 'none', 'rft', Width, Height)
gen_gauss_filter (GaussFilter2, Sigma2, Sigma2, 0.0, 'none', 'rft', Width, Height)
sub_image (GaussFilter1, GaussFilter2, Filter, 1, 0)
//生成负向高斯带通滤波器,用以傅里叶快速变换

//Read an image and convert it to gray values
read_image (Image, 32+'.bmp')
rgb1_to_gray (Image, Image)
//Perform the convolution in the frequency domain
//fft_image (Image, ImageFFT1)
rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)
//将时域中的原图转为频域中的形态
convol_fft (ImageFFT, Filter, ImageConvol)
//在频域中对原图的频域形态进行卷积。
rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width)
//将处理后的,处于频域形态的结果图转为时域形态。此时的结果图的像素是实数real的,有正有负。
//下面我们需要将实数real类型的图片转为位深为8的byte类型的0~255像素下的黑白图片。
min_max_gray (ImageFiltered, ImageFiltered, 0, Min, Max, Range1)
//计算一张图片的最大最小像素。
scale_image (ImageFiltered, ImageFiltered, 1, -Min)
//因为结果图像素值有正有负,我们需要将图片像素值都转为正的,即都增加-Min。
min_max_gray (ImageFiltered, ImageFiltered, 0, Min, Max, Range)
//计算一张图片的最大最小像素。
scale_image (ImageFiltered, ImageFiltered, 255/Max, 0)
//计算映射关系,将像素值对应到0~255上去。
convert_image_type (ImageFiltered, ImageConverted, 'byte')
//转换图像类型

在这里插入图片描述
那么我们就可以在上面这张结果图中,清楚的看见这个亮点。而这个亮点就对应原图中的那个比较模糊不易发现的暗点。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_47472749/article/details/119645379

智能推荐

Prometheus 入门与实践_Docker_的博客-程序员宅基地

随着容器技术的迅速发展,Kubernetes 已然成为大家追捧的容器集群管理系统。Prometheus 作为生态圈 Cloud Native Computing Foun...

肯德基在线点餐活动转链CPS接口_淘客兔开放平台的博客-程序员宅基地_肯德基cps

请求方式:GET公共参数(请求头参数):名称 类型 必须 说明 apiKey string 是 接口访问凭据 请求参数:注:请求参数区分大小写名称 类型 必须 说明 sid string 是 推广位 id int 是 活动编号:17,可通过返利活动接口获取 comm.

如何将.frm,.MYD,.MYI文件导入数据库_qq_18932003的博客-程序员宅基地

如何将.frm,.MYD,.MYI文件导入数据库导师给的项目数据库文件,发现不是一般的.sql文件,而是.frm、.MYD、.MYI这三个文件,咱们自己建的数据库文件是放在m那怎样导入到mysql数据库中呢,这就是博主写这篇博客的目的。1、首先了解一下这三个文件吧:.frm、.myd、.myi文件,也就是说是MySQL的原始数据文件,这三个文件分别是:.frm 表结构文件.myd 表数...

mysql bit对应oracle_mysql 实现类似oracle函数bitand功能_东哥起飞的博客-程序员宅基地

oracle中位运算函数bitand中在mysql的实现是 &运算符,我司使用的JPA要在oracle和mysql中自由切换,所以使用统一的位运算操作方法mysql实现bitand函数的功能,我们有两种解决方案:1.在mysql中,自定义函数bitand,CREATE DEFINER=`root`@`%` FUNCTION `bitand`(num1 decimal(65,0),num2...

作业帮云原生降本增效实践之路_阿里巴巴中间件的博客-程序员宅基地

本文整理自作业帮基础架构负责人董晓聪在云原生实战峰会上的分享,讲解作业帮降本增效实践的道路上遇到的问题及经验,主要分为三个方面。一是作业帮的业务和现状,以及为什么要做降本增效。第二,如何和...

报错:ImportError: libmysqlclient.so.20: cannot open shared object file: No such file or director(亲测可用)_lxw1844912514的博客-程序员宅基地

启动jumpserver报错 ImportError: libmysqlclient.so.20: cannot open shared object file: No such file or directory。查找这个libmysqlclient.so.20库文件,由于本机之前部署了mysql,所以可以查到这个文件(如果没有的话,可以安装mysql来获取这个文件)(py3) [[email protected] jumpserver]# find / -name libmysqlclient.so.

随便推点

机器学习实验二(李宏毅-判断年收入)_lunan0320的博客-程序员宅基地

机器学习 Lab2 实验报告欢迎大家访问我的GitHub博客 https://lunan0320.github.io/文章目录一、实验目的二、实验要求及环境2.1 实验要求2.2实验环境三、设计思想3.1 文件描述3.2 模型方法3.2.1 Gaussian Distribution3.2.2偏微分计算3.2.3 Logistic Regression3.2.4 Loss function(Cross Entropy)3.2.5 Adagrad过程3.3模型构想3.3.1 模型一:补充代码Gene

互联网时代用什么来拯救你的眼睛?_feitianhanxue的博客-程序员宅基地

随着智能手机、平板的普及,现如今,人们“读屏”的时间是越来越长了,使用各类移动终端办公的频率也越来越高。不过,很少人意识到,如果看屏幕的时间太长,对眼睛损害极大,尤其在光线相对较暗的环境和时间段中,此类问题将愈加突出。在这种背景下,市面上出现了一些护眼台灯,据说可以通过对灯光亮度、颜色进行调节,实现护眼的效果,那么这类护眼台灯是否“名副其实”呢?今天我用明基WiT护眼台灯为例亲身试验一次,顺便让大

(转)iscroll4的用法_smalltree_it的博客-程序员宅基地

iScroll.js的用法概要iScroll 4这个版本完全重写了iScroll这个框架的原始代码。这个项目的产生完全是因为移动版webkit浏览器(诸如iPhone,iPad,Android这些系统上广泛使用)提供了一种本地化的方式来对一个限定了高度和宽度的元素的内容进行滑动。很不幸的是,这种情况下所有的web应用的页面就不能够包含具有position:absolute的头、页尾或者是

NetBeans 时事通讯(刊号 # 111 - Jul 28, 2010)_weixin_33910434的博客-程序员宅基地

刊号 # 111 - Jul 28, 2010 文章NetBeans平台移植教程 一个关于移植Swing应用到NetBeans平台的简短教程。在NetBeans Zone中分析你的NetBeans应用 YANPA(另一个NetBeans平台应用)集合在继续增加。从NetBeans Zone签出基于...

一起来读书51- 计算机操作系统:第四章 存储器管理_狍子科技-贺汉景的博客-程序员宅基地

第四章 存储器管理存储器分层:cpu: 寄存器; 主存:高速缓存,主存,磁盘缓存; 辅存:磁盘,可移动介质;程序处理:编译->链接->装入链接方式:SL<静态链接>:事先进行链接...

linux拦截终端输入,Linux 终端输入控制_weixin_39777019的博客-程序员宅基地

涉及头文件:termios.h涉及结构:termios主要特性:行编辑:选择是否允许Backspace。缓冲:是立即读取还是缓冲读取Echo:比如读取密码的时候是否允许控制echo。struct termios {tcflag_t c_iflag;// 输入模式tcflag_t c_oflag; // 输出模式tcflag_t c_cflag; // 控制模式tcflag_t c_lflag; /...