rank_image(Image, Mask : ImageRank : Rank, Margin : )
rank_image使用掩码Mask 对输入图像Image执行秩滤波,并在ImageRank中返回经过滤波的的图像。
掩码的形状可以任意选择,例如,可以使用gen_circle或draw_region之类的操作符创建掩码。
掩模的位置不影响结果,因为掩模区域的重心作为掩模的参考点。
从概念上讲,秩滤波器按升序对掩模内的所有灰度值进行排序,然后选择具有次序Rank的灰度值。
秩1对应最小的灰度值,秩A对应掩模内最大的灰度值。
这里,A表示掩模的面积(参见area_center)。
对于Rank = (A - 1) / 2 + 1, rank_image返回中值灰度值(参见median_image)。
对于Rank = 1, rank_image执行灰度值腐蚀(参见gray_erosion_rect、gray_erosion_shape和gray_erosion),
而对于Rank = a rank_image执行灰度值膨胀(参见gray_dilation_rect、gray_dilation_shape和gray_dilation_shape)。
例如,可以使用rank_image来抑制噪声或抑制小于掩码的不需要的对象。
此外,与相关灰度值形态学算子相比,rank_image对噪声的敏感性较低。
因此,为了获得一个更健壮的灰度值形态学版本,不应该使用1或a,而是应该选择稍大或更小的值作为Rank。
通过参数Margin可以选择几种边框处理进行过滤:
灰度值 假设图像边框外的灰度值像素为为常量(具有指定的灰度值)。
“continued”边框像素的继续。
“cyclic”图像边框的循环延续。
“mirrored”像素在图像边框上的反射。
例程:
read_image (Image, 'fabrik')
gen_circle (Circle, 200, 200, 10)
rank_image (Image, Circle, ImageRank, 5, 'mirrored')
dev_display(ImageRank)
2.rank_n(Image : RankImage : RankIndex : )
运算符rank_n在所有通道上逐像素返回rank-function的结果。
对于输入图像中的每个像素,执行以下操作:
按升序排列该位置所有通道的灰度值。然后选择具有索引RankIndex的像素,并将其放置在输出图像的相同位置。
输出图像有一个通道。
在特殊情况下,RankIndex = 1和RankIndex = '(通道数)'返回最小值和最大值。
RankIndex = '(通道数+ 1)/ 2'返回中值(这里/表示整数除法)。
因此,对于一个五通道的图像,3返回中值。
运算符rank_n不应该与运算符rank_image混淆,后者计算某个掩码中的秩。
有关平滑滤波器概念的解释,请参阅“滤波/平滑”一章的介绍。
例程:
NumImages := 27
for Index := 1 to NumImages by 1
read_image (Image, 'bicycle/bicycle_' + Index$'02d')
if (Index == 1)
copy_obj (Image, MotionImages, 1, 1)
else
append_channel (MotionImages, Image, MotionImages)
endif
endfor
mean_n (MotionImages, ImageMean)
rank_n (MotionImages, ImageMedian, (NumImages + 1) / 2)
dev_display (ImageMedian)
3.rank_rect(Image : ImageRank : MaskWidth, MaskHeight, Rank : )
rank_rect对大小为MaskWidth×MaskHeight的矩形掩码的输入图像进行秩滤波,并在ImageRank中返回滤波后的图像。
从概念上讲,秩过滤器按升序对掩模内的所有灰度值进行排序,然后选择具有秩Rank 的灰度值。
秩1对应最小的灰度值,秩MaskWidth * MaskHeight对应掩码内最大的灰度值。
对于Rank = (MaskWidth * MaskHeight - 1) / 2 + 1,
rank_rect返回中值灰度值(参见median_rect)。
对于Rank = 1, rank_rect执行灰度值侵蚀(参见gray_erosion_rect、gray_erosion_shape和gray_erossion),
而对于Rank = MaskWidth * MaskHeight rank_rect执行灰度值膨胀(参见gray_dilation)
例如,可以使用rank_rect来抑制噪声或抑制小于掩码的不需要的对象。
此外,相对于相关灰度值形态学算子,rank_rect对噪声的敏感性较低。
因此,为了获得一个更健壮的灰度值形态学版本,不应该使用1或MaskWidth * MaskHeight,
而应该选择稍大或更小的值作为秩Rank 。
执行下面halocn自带例程,可以查看效果
read_image (Image, 'pcb_layout')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width / 2, Height / 2, 'black', WindowHandle)
dev_set_part (0, 0, Height - 1, Width - 1)
MaskSize := 7
RankErosion := 20
RankDilation := MaskSize * MaskSize + 1 - RankErosion
gray_opening_rect (Image, ImageOpening, MaskSize, MaskSize)
rank_rect (Image, ImageErosionRank, MaskSize, MaskSize, RankErosion)
rank_rect (ImageErosionRank, ImageOpeningRank, MaskSize, MaskSize, RankDilation)
dev_display (Image)
disp_message (WindowHandle, 'Original image', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_display (ImageOpening)
disp_message (WindowHandle, 'Gray value opening', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_display (ImageOpeningRank)
disp_message (WindowHandle, 'Rank-based opening', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_set_part (350, 445, 481, 526)
dev_display (Image)
disp_message (WindowHandle, 'Original image', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_display (ImageOpening)
disp_message (WindowHandle, 'Gray value opening', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_display (ImageOpeningRank)
disp_message (WindowHandle, 'Rank-based opening', 'window', 12, 12, 'black', 'true')
4.sigma_image(Image : ImageSigma : MaskHeight, MaskWidth, Sigma : )
sigma_image对所有输入图像(Image )的灰度值进行非线性平滑。
矩形窗口中的所有像素(MaskHeight x MaskWidth)用于确定此窗口中心像素的新灰度值。
首先,计算窗口中所有像素的灰度值标准差。
然后,使用窗口中所有灰度值与中心像素灰度值相差小于Sigma的像素,乘以该标准差用于计算中心像素的新灰度值。
中心像素的灰度值是所选像素灰度值的平均值。
如果没有选择像素对灰度值进行平均,则中心像素的灰度值保持不变。
例程:
read_image (Image, 'printer_chip/printer_chip_01')
sigma_image (Image, ImageSigma, 10, 10, 10)
|