二值化
一 图像分割之阈值分割:
请参见halcon例程:gray_histo.hdev
此例程中主要用到两个算了:
1.gray_histo(Regions,Image:::AbsoluteHisto,RelativeHisto)
作用:获得图像的某一指定区域内的灰度分布,将数据写入到参数AbsoluteHisto和RelativeHisto
其中AbsoluteHisto是指图像内0-255灰度值出现的次数。
RelativeHisto:将上面的出现次数转化为频率,总合为1。
2.gen_region_histo(:Region:Histogram,Row,Column,Scale:)
作用:把获得的灰度分布图转换为区域region输出
region:输出参数,
Histogram:上一个算子中提到的图像内0-255灰度值出现的次数。
Row,Column:生成的区域的中心坐标
Scale:region直方图的缩小尺度
3.阈值分割算子:
threshold(Image:Region:MinGray,MaxGray:)
作用:将灰度值在MinGray-MaxGray范围的region输出
此算子之前提到过,要注意的是 此算子如果是输入的是一张RGB彩色图,那么它只对此图的第一通道进行阈值分析。
4.阈值分割算子:
auto_threshold(Image:Regions:Sigma:)
作用:对单通道图像做自动阈值,多阈值分割。
其中Sigma为灰度直方图的高斯标准差,光滑消除噪声
5.阈值分割算子:
bin_threshold(Image:Region::)
作用:提取背景为白色,且前后背景较为分明,自动选取Sigma值进行高斯光滑处理,光滑直到最后只有一个最小值。例如提取白纸黑字,可以应用此算子。
6.阈值分割算子:
char_threshold(Image,HistoRegion:Characters:Sigma,Percent:Threshold)
作用:阈值分割提取字符
Image:原图像,要做字符提取的图像
HistoRegion:要提取字符所在的region
Characters:提取到的region
Sigma:高斯光滑因子
Percent:灰度直方图中的灰度值差的百分比
Threshold:输出用于阈值处理的阈值
此方法关键在于找到直方图中的最大值,在最大值的左侧找到读取阈值。可参考char_threshold.hdev例程
7.阈值分割算子:
dual_threshold(Image:RegionCrossings:MinSize,MinGray,Threshold:)
作用:分割符号图像的阈值处理,通常和算子:diff_of_gauss sum_image等算子一起使用,就像前后两帧做差得到的图像(差帧法),像素值有正值有负值(灰度值有正负之分)
Image:输入的符号图像
RegionCrossings:输出的区域
MinSize:输出的区域最小值(限制条件)
MinGray:输出的区域灰度值的绝对值必须大于MinGray
Threshold:输出的区域灰度值的绝对值必须大于Threshold 注意这里是绝对值 参见帮助文档
具体使用可参见dual_threshold.hdev例程
算子:
convert_image_type(Image:ImageConverted:NewType:)
作用:转换图像类型
Image:要转换的图像类型
ImageConverted:转换后的图像
NewType:指定一种图像类型(int1, int2, uint2, int4, int8, byte, real, direction, cyclic, complex)
然后两图做差,获得的是,像素值有正有负,图像做差算子:
sub_image(ImageMinuend, ImageSubtrahend, ImageSub,Mult,Add)
作用:两图像对应灰度值做差。
运算:ImageSub = (ImageMinuend-ImageSubtrahend)*Mult+Add
8.阈值分割算子:
dyn_threshold(OriImage,ThresholdImage:RegionDynThreh:Offset,LightDark:)
作用:动态阈值,不是全局阈值,而是局部阈值,它是根据像素周围的情况来决定阈值,一般和光滑算子mean_image()一起使用,这样才能将其他像素值与它周围的像素做比较,这个 算子可以取暗边界区域,或者亮边界区域,一般应用灰度值边界区域提取。
OriImage:单通道原图像
ThresholdImage:用于对比局部阈值的图像
RegionDynThreh:阈值分割后获得的区域
Offset:原图像与对比图像的像素值比较抵消值
LightDark:决定选取是暗边界还是亮边界及相似边界。。。如果LightDark='light'等价于:OriImage >= ThresholdImage+Offset。如果LightDark='dark' 等价于OrigImage>=ThresholdImage+Offset 。 如果LightDark='equal'等价于:ThresholdImage-Offset <=OrigImage<=ThresholdImage+Offset。 如果LightDark='not_equal'等价于:ThresholdImage-Offset>OrigImage or OrigImage>ThresholdImage+Offset
9.阈值分割算子var_threshold
var_threshold也是局部阈值,根据(掩模)局部均值和标准差来做阈值分割;与dyn_threshold有相似之处。
参见dyn_threshold.hdev例程
其中有个算子:fill_interlace()作用是修改在采集图像过程中造成的两个半幅图像拼接的问题
二 图像分割之彩色分割:
彩色图像有多种常见的颜色模式,比如RGB,YUV,HSV,CMYK等,这里介绍RGB和HSV颜色模型
1.RGB通道:
RGB分别代表哪种颜色就不用多说了,在图像数据的存储中,每一个像素点颜色都是有RGB三个颜色综合表示,其中RGB各占一个字节,也就是RGB它们的值范围是0-255,这样就把颜色分为256个等级,三通道共可以表示 256*256*256种颜色,大约1600W种颜色,可以代表了自然界中所有的颜色。
那么假如我们现在有一幅图像,是纯红色的图像,那它的每一个像素值都应该是:R 255,G 0, B 0; 我们先准备这样一张图像.
然后我们用halcon打开这个图像,打开图像后,把这幅图分开三通道RGB:
选择菜单..算子..image..channel..decompose3;
算子:decompose3(MultiChannelImage:Image1,Image2,Image3::)
作用:转换三通道图像为三个单通道的图像
MultiChannelImage:输入的要转换的多通道图像
Image1:转换的第一个通道图像,对应Red红色
Image2:转换的第二个通道图像,对应Green绿色
Image3:转换的第三个通道图像,对应Blue蓝色
应用以上算子分解后,其中得到的第一通道图像红色通道是一副白色图像,,而绿色和蓝色通道是黑色图像,为什么会出现这种现象????
因为这是一张纯红色图像,那么他的所有像素值应该是R 255,G 0, B 0, 所以转换后,R通道的所有像素值是255,纯白色图像,而G和B通道都是0,纯黑色图像...红颜色在R通道中比较明显,同理,绿颜色和蓝色分别在G和B通道中比较明显;
这里有个技巧:在图形窗口上,显示一张图像时,按住Ctrl键不放,鼠标放在图像上,显示:位置和像素值
HSV颜色模型:
这个模型中颜色的参数分别是:色相(H),饱和度(S),明亮度(V)
色相(H):是色彩基本属性,就是平常所说的颜色,如红色,黄色等取值0-360
饱和度(S)是色彩的纯度,越高色彩越纯,低则逐渐变淡,取值0-1;它表示成所选颜色的纯度和该颜色最大的纯度之间的比率.S=0时,只有灰度.
明亮度(V)是色彩的明亮程度,范围从0-1.有一点要注意,它和光强度之间并没有直接的联系.
那么HSV怎么表示颜色呢? 以我们上面的问题为例,怎么表示红色??首先从色相H上来说,基本属性颜色,大致H取360左右为红色,饱和度S取值0-1,当S取1时,颜色最浓,取0时最淡.
利用算子:trans_from_rgb(ImageRed, ImageGreen, ImageBlue:ImageResult1, ImageResult2,ImageResult3:ColorSpace:)
可以将一个rgb图像转换为其他颜色模型的图像