halcon图像处理基本运算
图像处理最基本的操作包括颜色空间转换,各种代数运算,放射变换等。通过熟悉这些常见的操作,可以对图像有基本的认识,尤其是对刚开始接触视觉图像处理的人而言,熟悉这些操作,可以快速对图像有一个了解。比如能够明白RGB模型,HSI模型、HSV模型等这些颜色空间模型。能够对灰度图、彩色图有一定的认识,同时也能理解图像的位数、通道等概念。通过代数运算,能够明白图像处理其实就是对一堆二维矩阵数字进行运算。代数运算可以了解图像的数据类型,有的图像是用byte类型表示的像素值,有的使用int表示,有的是用real表示,对于某些操作,有一定的数据类型的限制。放射变换可以了解图像的平移、旋转等概念。
RGB一般是24位彩色图像,颜色数量共有224种。RGB图像由红、绿、蓝三个通道组成,每个通道的图像是一个二维数字矩阵,每个数字用8位来存储,一个像素占24位,所以是24位图像。灰度图是RGB三个分量中的值相等,即R=G=B。这三个值相等的时候,显示出来的图像就只有亮度信息,看起来就像是黑白图像。由于RGB三个通道的值相等,因此,灰度图只需要存储一个通道的数字,所以只需要用8位来存储一个像素的值,所以我们一般称为8位灰度图。RGB图像可以转换成灰度图像,有多种转换方式,常见的是对每个RGB分量设定一定的权重,然后三个分量求和得到灰度值。有时候也可以分别提取RGB的每个分量来进行图像处理,每个分量单独显示的时候,看起来也是灰度图,只是三个分量分别凸显的原RGB图像的特征有一些不同,如果进行图像处理,就要看下哪个分量能够更加凸显图像的特征,这是就取哪个分量来进行图像处理。同样的方式适用于HSI或HSV颜色模型。HSI或HSV也表示的图像三个分量,只是这个分量分别表示的图像的色调(hue)、色饱和度(saturation)和强度(intensity)或明亮值(value)。HSI和HSV只是I和V不一样,I=(R+G+B) / 3,是RGB三个分量的平均值,V = max(max(R,G),B)是RGB三个分量的最大值。由于I和V的不同,也使得S的值有所不同。
图1 RGB颜色模型
图2 HSI颜色模型
图像代数运算主要是指图像的加减乘除、对数、三角函数、指数、幂运算等,通过这些操作,熟悉图像处理实际上是对数字矩阵的处理。当然,这些运算在实际的图像处理时也是有用的,这需要根据图像来判断到底用什么方法。通过图像代数运算,也可以了解图像的数据类型,有的运算需要int数据,有的运算需要real数据,有的运算所有数据类型都可以运算。
放射变换是指图像的平移、旋转等变换。通过放射变换,可以了解图像变换的原理,实际上就是一个变换矩阵,通过变换矩阵实现坐标位置的改变。其中尤其是旋转变换比较重要,因此,在实际的图像处理中,由于各种原因,需要检测的图像的特征部分不一定是水平或垂直放置的,这时候就需要通过一定的旋转变换,将特征旋转到水平位置或垂直位置。
下面通过一个具体的例子,来看下在halcon里面怎么实现上面的操作。所用到的图像就以halcon自带的一张图像为例。
图3 待处理的原图
图4 所有处理的结果图像
*读取一张彩色图像
read_image (Image,'blister/blister_reference')
*得到图像通道数
count_channels(Image,Channels)
*彩色图像转灰度图
rgb1_to_gray(Image, GrayImage)
*彩色图像分离为三个通道图像
decompose3(Image,R,G,B)
*RGB转HSV和HSI
trans_from_rgb(R,G,B,H1,S1,V1,'hsv')
trans_from_rgb(R,G,B,H2,S2,I2,'hsi')
*HSV和HIS转RGB
trans_to_rgb(H1,S1,V1,ImageRed, ImageGreen,ImageBlue, 'hsv')
trans_to_rgb(H2,S2,I2,ImageRed1,ImageGreen1, ImageBlue1, 'hsi')
*将转换后的单通道RGB合并成RGB彩色图
compose3(ImageRed,ImageGreen,ImageBlue,ImageRGB)
*图像均值模糊
mean_image(GrayImage,ImageMean, 9, 9)
*图像相加,相减,相减的绝对值,线性拉伸,图像相乘除
add_image(GrayImage, ImageMean,ImageResult, 0.5, 0)
sub_image(GrayImage,ImageMean,ImageSub, 1,128)
abs_diff_image(GrayImage,ImageMean,ImageAbsDiff,1)
scale_image(ImageAbsDiff, ImageScaled, 5,20)
mult_image(GrayImage,ImageMean,ImageResult1,0.005, 0)
div_image(GrayImage,ImageMean,ImageResult2,255, 0)
*指数、gamma变换、图像反转、对数、幂、开方
exp_image(GrayImage,ExpImage, 'e')
gamma_image(GrayImage,GammaImage,0.416667,0.055, 0.0031308, 255, 'true')
invert_image(GrayImage,ImageInvert)
log_image(GrayImage,LogImage, 'e')
pow_image(GrayImage,PowImage, 2)
sqrt_image(GrayImage,SqrtImage)
pow_image(SqrtImage, PowImage1, 3)
*图像数据格式转换
convert_image_type(GrayImage,ImageConverted,'real')
*三角函数运算
sin_image(ImageConverted, SinImage)
cos_image(ImageConverted,CosImage)
tan_image(ImageConverted,TanImage)
asin_image(SinImage,ArcsinImage)
acos_image(CosImage,ArccosImage)
atan_image(TanImage,ArctanImage)
*取两幅图像的最大值或最小值
max_image(GrayImage,ImageMean,ImageMax)
min_image(GrayImage,ImageMean,ImageMin)
*创建一个单位变换矩阵,每次根据创建的平移或、旋转或缩放矩阵对图像进行平移、旋转、缩放操作
hom_mat2d_identity(HomMat2DIdentity)
*创建平移矩阵
hom_mat2d_translate(HomMat2DIdentity,20,50,HomMat2DTranslate)
*图像平移
affine_trans_image(GrayImage,ImageAffineTrans,HomMat2DTranslate, 'constant', 'false')
get_image_size(GrayImage,Width, Height)
*创建旋转矩阵
hom_mat2d_rotate(HomMat2DIdentity,rad(45),Width/2,Height/2, HomMat2DRotate)
*图像旋转
affine_trans_image(GrayImage,ImageAffineTrans1,HomMat2DRotate, 'constant', 'false')
*创建缩放矩阵
hom_mat2d_scale(HomMat2DIdentity, 2, 1.5,Width/2, Height/2, HomMat2DScale)
*图像缩放
affine_trans_image(GrayImage,ImageAffineTrans2,HomMat2DScale, 'constant', 'false')
*根据图像得到的region,通过计算中心和方向,利用vector_angle_to_rigid得到变换矩阵,然后进行图像放射变换
threshold(GrayImage,Region, 128, 255)
shape_trans(Region, RegionTrans, 'convex')
orientation_region(RegionTrans, Phi)
area_center(RegionTrans, Area, Row, Column)
vector_angle_to_rigid(Row, Column, Phi,Row, Column, 0, HomMat2D)
affine_trans_image(GrayImage,ImageAffineTrans3,HomMat2D, 'constant', 'false')