ps:以下演示的所有代码都是在HDevelop编译器上编写
图像的数字化
现实中的图像是不能通过计算机去处理的,毕竟现实中的图像它没有“new”并产生一个对象到计算机系统里去。要将图像抽象成一个类需要分析图像本身,一只眼睛看景物它会是一个平面,而平面它属于二维的,我们可以把图像描述成一个二维平面。然而这样的图像我们称它为连续图像,它还是达不到计算机处理的要求,计算机处理要求是想图像中每个位置每个角落都能通过计算机精准定位和操作,比如说我想把某个区域的颜色变亮一点对比度增高一点其它地方不变。这样就需要将图像进行离散处理,把图像的每个位置每个角落都拆分为最小单位最小对象:pixel(像素)。这样,将连续图像经过离散处理成由 width * height 个像素对象组成的图像叫数字图像。因此一副静态图像可由一个二维数组来描述。二维数组中的一个元素,表示的是二维空间中的一个坐标点,表示该点形成的影像的某种性质。
数字图像存储与处理测试代码(这里用的是halcon软件)
read_image (Image, 'fabrik')
*获取图像宽高
get_image_size (Image, Width, Height)
*在图像上画一条y=x的直线
for i := 0 to Height-1 by 1
*获取像素的灰度值
get_grayval (Image, i, i, Grayval)
*设置像素的灰度值
set_grayval (Image, i, i, 255)
endfor
其实,相机的CCD和CMOS芯片本身就将现实中的景物进行了离散处理。CCD和CMOS芯片的组成就是由W * H 个像元组成,每个像元都是一个独立的存在,它描述二维空间中的某个坐标点某一色彩性质,并且芯片的大小(像元的数量)决定了成像后的图像大小。
CMOS芯片摄图原理:
彩色图片采集原理:
彩色图像
彩色图像是指由多种颜色组成的图像。其中每种颜色又由RGB三基色搭配而成,每种基色都有0~255个梯度,这0到255的值代表三基色亮度区间,而这个区间是由多次图像采样色彩量化后发现0~255个亮度梯度差在正常人类视觉中能很好的描述现实图像。如果每个像素都用8位二进制数表示则有256个量级,16位二进制有65536个量级。量级越大,图像质量越好,占用内存越大,处理时间越长。因此选择0~255个量级既能满足视觉感受又能节省存储成本以及处理时间。
图像采样(图像离散像素化):
量化(色彩离散):
灰度图像
灰度图像是指只有亮度差别,而没有颜色差别的图像。彩色图像转灰度图像的公式:
Y=0.299R+0.587G+0.114B 。其中Y代表亮度,带入三基色区间得到 灰度图像的亮度取值范围也是 0~255。
代码实现:
*读取一张图片
read_image (Image, 'C:/Users/斌/Desktop/test.png')
*获取图像宽高
get_image_size (Image, Width, Height)
*遍历像素点
for i := 0 to Height-1 by 1
for j := 0 to Width-1 by 1
*获取像素点的RGB值
get_grayval (Image, i, j, Grayval)
*设置像素灰度值,灰度化公式Y=0.299*R+0.587*G+0.114*B
set_grayval (Image, i, j, 0.299*Grayval[0]+0.587*Grayval[1]+0.114*Grayval[2])
endfor
endfor
二值图像
当灰度图像的灰度只有两个等级时,这种图像就叫二值图像。可以只用“全黑”与“全白”来对图像进行描述。
(下图分别为彩色图像转灰度图转二值图)
halcon代码:
*彩色图像
read_image (Image, 'C:/Users/斌/Desktop/图片/3.jpg')
*灰度图像
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
rgb1_to_gray (Image, GrayImage)
*二值图像
dev_open_window (0, 0, 512, 512, 'black', WindowHandle1)
scale_image_range (GrayImage, ImageScaled, [127,0], [128,255])