第4章灰度图像处理
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.1
SetPixel
彩色图像转灰度图像
函数功能:该函数将指定坐标处的像素设为指定的颜色。 函数原型:COLORREF SetPixel(HDC hdc, int X, int Y, COLORREF crColor); 参数: hdc:设备环境句柄。 X:指定要设臵的点的X轴坐标,按逻辑单位表示坐标。 Y:指定要设臵的点的Y轴坐标,按逻辑单位表示坐标。 crColor:指定要用来绘制该点的颜色。 返回值:如果函数执行成功,那么返回值就是函数设臵像素的RGB颜色值。 这个值可能与crColor指定的颜色有所不同,之所以有时发生这种情况是因为 没有找到对指定颜色进行真正匹配造成的;如果函数失败,那么返回值是 -1。
常用的三段线性变换法其数学表达式如下:
c 0 f ( x, y) a f ( x, y ) a d c a f ( x, y) b g ( x, y ) [ f ( x, y ) a ] c d a M d g b f ( x, y) M f [ f ( x , y ) b] d M f b
4.2.4 直方图的映射变换
一幅给定图像的灰度级分布在 0≤r≤1 范围内(灰度级进 行了归一)。可以对[0, 1]内的任一r值进行变换 保证了图像的灰度级 s=T(r) 从白到黑的次序不变 保证了映射变换后 变换函数T(r)应满足下列条件: 的像素灰度值在容 许的范围内 (1) 在0≤r≤1区间内,T(r)值单调增加; (2) 对于0≤r≤1, 有 0≤s≤1。
O
a
b
f (x, y)
实例:逆反处理
255
g ( x, y) 255 f ( x, y)
For j = 0 To h- 1 For i = 0 To w - 1 g(i,j) = 255 - f(i, j)
输 出 灰 度
Next i
0 输入灰度 255
Next j
4.3.2 分段线性变换
突出感兴趣的灰度区间。
利用Matlab进行图像灰度变换
j 0
nj n
5 2 6 6 2 6
pr (rj )
j 0
k
0 rj 1
k 0,1,, l 1
其反变换式为
1 6 1 3 1 1 2 4 6 4 4 3 3 3 6 5 6 6 4 2 4 6 6 4
rk T ( sk )
6 1 6 6 3 6
1
4.2.5 直方图均衡
subplot(2,2,1),imshow(I); title('原图像');
subplot(2,2,2),imhist(I); title('原图像的直方图'); J=histeq(I); %直方图均衡化
subplot(2,2,3),imshow(J); title('直方图均衡化后的图像'); subplot(2,2,4),imhist(J); title('均衡化后的图像的直方图')
nYPos:指定要检查的像素点的逻辑Y轴坐标。
返回值:返回值是该象像点的RGB值。
声明方法: Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal Y As Long) As Long
4.2.5 直方图均衡
4.3
灰 度 变 换
4.3.1 灰度线性变换
原图像f(x, y)的灰度范围为[a, b],希望变换后图像
g(x, y)的灰度范围扩至[c, d],则线性变换可表示为:
g (x, y) d
g ( x, y )
c
d c [ f ( x, y ) a ] c ba
4.2
4.2.1 直方图的基本概念
直 方 图
灰度直方图表示图像中具有某种灰度级的像素的个数。
1 1 6 1 3 1 1 2 4 6 4 4 3 3 3 6 5 6 6 4 2 4 6 6 4 5 2 6 6 2 6 6 1 6 6 3 6 5 2 4 3 5 4 6 5 2 6 14
4.2.2 直方图的性质
百度文库
4.2.5 直方图均衡
直方图均衡化处理是以累积分布函数变换法为基础的 直方图修正法。变换函数为
s T ( r ) pr ( )d
0
r
式中:ω是积分变量,而
p ( )d 就是r的累积分布函数。
0 r
r
4.2.5 直方图均衡
当灰度级是离散值时:
k
sk T (rk )
4.1
2、最大值法
彩色图像转灰度图像
Private Sub Command3_Click() w = Picture1.ScaleWidth h = Picture1.ScaleHeight For i = 0 To w - 1 For j = 0 To h - 1 rgb1 = GetPixel(Picture1.hdc, i, j) Red = rgb1 Mod 256 '获得红色值 Green = rgb1 \ 256 Mod 256 '获得绿色值 Blue = rgb1 \ 65536 '获得兰色值 '取R、G、B分量最大值作为灰度 If Red > Green And Red > Blue Then Col = Red If Green > Red And Green > Blue Then Col = Green If Blue > Red And Blue > Green Then Col = Blue rgb1 = RGB(Col, Col, Col) SetPixelV Picture2.hdc, i, j, rgb1 Next j Next i Picture2.Picture = Picture2.Image End Sub
1、分量法(R分量法)
Private Sub Command2_Click() Picture1.Picture = Picture2.Picture w = Picture1.ScaleWidth h = Picture1.ScaleHeight For i = 0 To w-1 For j = 0 To h-1 rgb = GetPixel(Picture1.hdc, i, j) Red = rgb mod 256 '获得红色值 Green = rgb \256 mod 256 '获得绿色值 Blue = rgb\65536 '获得兰色值 '取R分量作为灰度 rgb = RGB(Red,Red,Red) SetPixelV Picture2.hdc, i, j, rgb Next j Next i Picture2.Picture = Picture2.Image End Sub
(1) 只含图像各灰度值像素出现的概率,而无位臵信息。
(2)
图像与直方图之间是多对一的映射关系。
(3)
图像各子区的直方图之和就等于该图像全图的直方图。
(a)
(b)
(a)
(b)
(c)
4.2.3 直方图的计算与简单绘制
在离散形式下,灰度直方图的计算如下:
rk代表离散灰
度级
nk为图像中出现 rk级灰度的像素
pr(rk)代表概 率密度函数,
表示原始图 像的灰度分 布
nk pr ( rk ) n
数
n是图像像素总数
在坐标中做出rk与pr(rk)的关系图形,即为该图像的直方图。
直方图程序设计
Line方法: object.Line (x1, y1) - (x2, y2),RGB (Red, Green, Blue)
4.1
1、分量法 2、最大值法
彩色图像转灰度图像
3、平均值法
4、加权平均法
4.1
GetPixel
彩色图像转灰度图像
函数功能:该函数检索指定坐标点的像素的RGB颜色值。 函数原型:COLORREF GetPixel(HDC hdc, int nXPos, int nYPos) 参数: hdc:设备环境句柄。 nXPos:指定要检查的像素点的逻辑X轴坐标。
4.1
4、加权平均法
彩色图像转灰度图像
Private Sub Command5_Click() Picture1.Picture = Picture2.Picture w = Picture1.ScaleWidth h = Picture1.ScaleHeight For i = 0 To w-1 For j = 0 To h-1 rgb1 = GetPixel(Picture1.hdc, i, j) Blue = rgb1 mod 256 '获得兰色值 Red =rgb1\256 mod 256 '获得红色值 Green = rgb1 \65536 '获得绿色值 '将三原色取其权值转换为灰度 Y = (9798 * Red + 19235 *Green + 3735 * Blue) \ 32768 '将灰度转换为RGB rgb1 = RGB(Y, Y, Y) SetPixelV picture2.hdc, i, j, rgb1 Next j Next i Picture2.Picture = Picture2.Image End Sub
声明方法: Private Declare Function SetPixelV Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal Y As Long, ByVal crColor As Long) As Long
4.1
彩色图像转灰度图像
4.1
3、平均值法
彩色图像转灰度图像
Private Sub Command4_Click() Picture1.Picture = Picture2.Picture w = Picture1.ScaleWidth h = Picture1.ScaleHeight For i = 0 To w - 1 For j = 0 To h - 1 rgb1 = GetPixel(Picture1.hdc, i, j) Red = rgb1 Mod 256 '获得红色值 Green = rgb1 \ 256 Mod 256 '获得绿色值 Blue = rgb1 \ 65536 '获得兰色值 '取R、G、B三分量平均值作为灰度 col = (Red + Green + Blue) / 3 rgb1 = RGB(col, col, col) SetPixelV Picture2.hdc, i, j, rgb1 Next j Next i Picture2.Picture = Picture2.Image End Sub
s0 T (r0 ) Pr (rj ) Pr (r0 )
j 0 1 0
5 1 36 5
9 1 36 5 j 0 2 14 2 s2 T (r2 ) Pr (rj ) s1 Pr (r2 ) 36 5 j 0 3 20 3 s3 T (r3 ) Pr (rj ) s2 Pr (r3 ) 36 5 j 0 22 3 s4 T (r4 ) s3 Pr (r4 ) 36 5 36 s5 T (r5 ) s4 Pr (r5 ) 1 36 s1 T (r1 ) Pr (rj ) Pr (r0 ) Pr (r1 )
(x1,y1)是直线的起点坐标,若省略(x1,y1),则起点为当前坐标位置 (CurrentX,CurrentY)。(x2,y2)是直线的终点坐标。 scale方法: object.scale (x1, y1) - (x2, y2)
用于设定坐标系统。(x1,y1)是坐标系统的左上角坐标,(x2,y2)是坐 标系统的右下角坐标。 设计一图像直方图程序
rk r0=0 r1=1/5 r2=2/5 r3=3/5 r4=4/5 r5=1
nk n0=5 n1=4 n2=5 n3=6 n4=2 n5=14
nk/n 5/36 4/36 5/36 6/36 2/36 14/36
1
2
3
4
5
6
1
2
3
4
5
6
Matlab程序: clear all; close all; I=imread('pout.tif');