Halcon:去除墨水,保留纹理

处理图片:
在这里插入图片描述

代码如下:

*刷新
dev_update_off ()
*关闭窗口
dev_close_window ()
Scale := [1.0,.65]
MinGray := [50,100]
for Index := 0 to 1 by 1
* 读取图像
read_image (Image, ‘plan_’ + (Index + 1)$‘02’)
*获取图像宽高
get_image_size (Image, Width, Height)
*打开窗口
dev_open_window (0, 0, Width * Scale[Index], Height * Scale[Index], ‘black’, WindowHandle)
*设置字体
set_display_font (WindowHandle, 14, ‘mono’, ‘true’, ‘false’)
*设置显示位置
dev_set_part (0, 0, Height - 1, Width - 1)
*显示图像
dev_display (Image)
*显示原图
disp_message (WindowHandle, ‘Original image’, ‘window’, 12, 12, ‘black’, ‘true’)
*
*优化傅里叶变换速度
optimize_fft_speed (Width, Height, ‘standard’)
* 从空间域变换到频域
*图中黑色墨水就代表着中间的十字星,小亮点是背景纹理图
fft_generic (Image, ImageFFT, ‘to_freq’, -1, ‘sqrt’, ‘dc_center’, ‘complex’)
*显示适配的窗口
dev_open_window (0, Width * Scale[Index] + 7, Width * Scale[Index], Height * Scale[Index], ‘black’, WindowHandle1)
*设置颜色红色
dev_set_color (‘red’)
*设置填充模式
dev_set_draw (‘margin’)
*设置字体
set_display_font (WindowHandle1, 14, ‘mono’, ‘true’, ‘false’)
dev_set_part (0, 0, Height - 1, Width - 1)
dev_display (ImageFFT)
disp_message (WindowHandle1, ‘Fourier spectrum’, ‘window’, 12, 12, ‘black’, ‘true’)
disp_cont_message (WindowHandle1, ‘black’, ‘true’)
stop ()
*
* 从频谱转换为功率图(能量图),这时可以处理
power_real (ImageFFT, PowerSpectrum)
*创建一个低通滤波
binomial_filter (PowerSpectrum, ImageSmooth, 9, 9)
*二值化分割
threshold (ImageSmooth, Region, MinGray[Index], 100000)
*区域分离
connection (Region, ConnectedRegions)
*面积筛选,筛选其中小一点的,面积只在5-200个像素间的
select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 5, 200)
*筛选后的区域再联合在一起
union1 (SelectedRegions, RegionUnion)
*联合这些区域
reduce_domain (ImageSmooth, RegionUnion, ImageReduced)
*获得局部最大值的区域
local_max (ImageReduced, LocalMaxima)
* 做一个形态学的凸性转换,是为了完全包裹住这个亮点
shape_trans (LocalMaxima, RegionTrans, ‘convex’)
*创建新矩阵
hom_mat2d_identity (HomMat2DIdentity)
*做一个放大2.1倍的矩阵
hom_mat2d_scale (HomMat2DIdentity, 2.1, 2.1, Height / 2, Width / 2, HomMat2DScale)
*放大目标区域
affine_trans_region (RegionTrans, RegionTrans1, HomMat2DScale, ‘nearest_neighbor’)
*扩大1.9倍的矩阵
hom_mat2d_scale (HomMat2DIdentity, 1.9, 1.9, Height / 2, Width / 2, HomMat2DScale)
*放大1.9倍的区域
affine_trans_region (RegionTrans, RegionTrans2, HomMat2DScale, ‘nearest_neighbor’)
*计算出的差集,就是中间的一个2.1倍-1.9倍的一个中间的带通滤波器
*为了定位到亮点
difference (RegionTrans1, RegionTrans2, RegionDifference)
*获得其中的区域
reduce_domain (ImageSmooth, RegionDifference, ImageReduced)
*二值化分割
threshold (ImageReduced, Region, 15, 100000)
*再获得目标区域
reduce_domain (ImageSmooth, Region, ImageReduced)
*涂黑亮点区域
local_max (ImageReduced, LocalMaxima2)
* 区域联合
union2 (LocalMaxima, LocalMaxima2, RegionUnion)
*做一个区域膨胀,以15.5个像素值为半径
dilation_circle (RegionUnion, RegionDilation, 15.5)
*这部分是我添加的,用于直接将这里面的小亮点保留下来,变换到空间域中,可以看到是背景纹理图
*complement (RegionDilation, RegionComplement)
*paint_region (RegionComplement, ImageFFT, ImageFFTFiltered, 0, ‘fill’)
*fft_generic (ImageFFTFiltered, ImageFiltered, ‘from_freq’, 1, ‘sqrt’, ‘dc_center’, ‘real’)
*将这些区域里面都填黑色,阻挡住这些频段
paint_region (RegionDilation, ImageFFT, ImageFFTFiltered, 0, ‘fill’)
*显示傅里叶变换图
dev_display (ImageFFT)
*显示膨胀的区域
dev_display (RegionDilation)
disp_message (WindowHandle1, ‘Frequencies of the\nbackground texture’, ‘window’, 12, 12, ‘black’, ‘true’)
disp_cont_message (WindowHandle1, ‘black’, ‘true’)
stop ()
* 再从频域变换回空间域
fft_generic (ImageFFTFiltered, ImageFiltered, ‘from_freq’, 1, ‘sqrt’, ‘dc_center’, ‘byte’)
*显示处理后的图像
dev_display (ImageFiltered)
disp_message (WindowHandle1, ‘Filtered image’, ‘window’, 12, 12, ‘black’, ‘true’)
* 打开窗口
dev_open_window (0, 2 * (Width * Scale[Index]) + 14, Width * Scale[Index], Height * Scale[Index], ‘black’, WindowHandle2)
set_display_font (WindowHandle2, 14, ‘mono’, ‘true’, ‘false’)
dev_set_part (0, 0, Height - 1, Width - 1)
原图和处理后图像的差值,因为灰度差值1+128,所以看起来纹理背景图会显的明显一点
sub_image (Image, ImageFiltered, ImageTexture, 1,128)
*显示纹理图
dev_display (ImageTexture)
disp_message (WindowHandle2, ‘Removed texture’, ‘window’, 12, 12, ‘black’, ‘true’)
if (Index < 1)
disp_cont_message (WindowHandle2, ‘black’, ‘true’)
stop ()
dev_close_window ()
dev_close_window ()
dev_close_window ()
endif
endfor

对应示例程序:
remove_texture_fft.hdev

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值