本帖最后由 hankchang 于 2025-2-28 17:30 编辑
方法二
***使用FFT 低通濾波去除背景: 本方法應該可以解決方法一, 因背景差異所帶來的問題, 應可適用於各種背景狀況
dev_close_window()
dev_open_window(0, 0, 512, 512, 'black', WindowHandle)
read_image (Image160726c3yzr9itzqu898wi, 'C:/Users/genel/OneDrive/桌面/160726c3yzr9itzqu898wi.jpg')
rgb1_to_gray(Image160726c3yzr9itzqu898wi, GrayImage)
get_image_size(GrayImage, Width, Height)
***截止頻率可用範圍很大 0.015~0.04
gen_lowpass (ImageLowpass, 0.04, 'none', 'dc_center', Width, Height)
fft_generic(GrayImage, ImageFFT, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')
convol_fft(ImageFFT, ImageLowpass, ImageConvol)
fft_generic(ImageConvol, ImageFFT1, 'from_freq', 1, 'sqrt', 'dc_center', 'byte')
***去除低通部分(刪去背景 無論亮暗)
sub_image(GrayImage, ImageFFT1, ImageSub, 1, 128)
***這樣可以降低背景亮暗不均的干擾
*binary_threshold(ImageSub, Region, 'max_separability', 'dark', UsedThreshold)
mean_image(ImageSub, ImageMean, 51, 51)
dyn_threshold(ImageSub, ImageMean, Region, 5, 'dark')
connection(Region, ConnectedRegions)
select_shape(ConnectedRegions, SelectedRegions, 'outer_radius', 'and', 1000, 2000)
smallest_circle(SelectedRegions, Row, Column, Radius)
gen_circle(Circle, Row, Column, Radius-80)
intersection(Region, Circle, RegionIntersection)
connection(RegionIntersection, ConnectedRegions1)
select_shape(ConnectedRegions1, SelectedRegions1, 'area', 'and', 50, 999999)
union1(SelectedRegions1, RegionUnion)
**
closing_circle(RegionUnion, RegionClosing, 90.5)
opening_circle(RegionClosing, RegionOpening, 50.5)
***取得外圓
shape_trans(RegionOpening, outer_circle, 'outer_circle')
difference(outer_circle, RegionOpening, raw_inner_part)
**取得光學區域
connection(raw_inner_part, ConnectedRegions2)
select_shape_std(ConnectedRegions2, inner_part, 'max_area', 70)
shape_trans(inner_part, optical_region, 'outer_circle')
***獲得環狀印刷區域
difference(outer_circle, optical_region, ink_region)
|