数字图像处理2013年9月数字图像处理主要内容•1、点运算•2、邻域操作数字图像处理1、点运算•点运算也称为对比度增强和拉伸、灰度变换,是一种通过对图像中的每个像素值进行计算,从而改善图像显示效果的操作。•点运算常用于改变图像的灰度范围及分布,是图像数字化及图像显示的重要工具。在真正进行图像处理之前,有时可以用点运算来克服图像数字化设备的局限性。数字图像处理1、点运算•典型的点运算应用包括:–光度学标定:对光失真光学图像的校正。•例如:图像被非线性的仪器数字化,可以用点运算变换灰度级,使之反映光照强度的等步长增量。)–对比度增强:调整图像的亮度、对比度,以便观察。数字图像处理1、点运算•典型的点运算应用包括:–显示标定:显示校正,突出感兴趣的局部特征,甚至补偿显示屏的伽玛值。•例如:如果图像像素的灰度值与屏幕上点的主观亮度呈非线性,就可用点运算校正。数字图像处理1、点运算•典型的点运算应用包括:–轮廓线确定:为图像加上轮廓线,对图像阈值化。•例如:根据灰度线划分图像区域、等高线。–图像裁剪:将输出图像的灰度级限制在可用范围内。•例如:将灰度级在0-255之外的那些值裁剪掉。数字图像处理1、点运算•点运算是像素的逐点运算,它将输入图像映射为输出图像,输出图像每个像素点的灰度值仅由对应的输入像素点的灰度值决定。点运算不会改变图像内像素点之间的空间关系。数字图像处理1、点运算•设输入图像为A(x,y),输出图像为B(x,y),则点运算可表示为:B(x,y)=f(A(x,y))•点运算完全由灰度映射函数f决定。根据f的不同可以将图像的点运算分为线性点运算和非线性点运算两种。数字图像处理1、点运算•线性点运算–线性点运算的灰度变换函数形式可以采用线性方程描述,即s=ar+b–其中,r为输入点的灰度值,s为相应输出点的灰度值。a1输出对比度加大(扩)a1输出对比度减小(压)a1、b0不发生变化a1、b0灰度值上移或下移a0图像求补(暗区域变量,亮区域变暗)。rsba0255255数字图像处理1、点运算•线性点运算50BADD1.5BADD0.8BADD1255BADDlena.png数字图像处理1、点运算•线性点运算–rice=imread('rice.png');–I=double(rice);–J=I*0.43+60;–rice2=uint8(J);–subplot(1,2,1),imshow(rice);–subplot(1,2,2),imshow(rice2);数字图像处理1、点运算•线性点运算–fruits=imread('fruits.jpg');–I=double(fruits);–J=I*0.43+60;–fruits2=uint8(J);–subplot(1,2,1),imshow(fruits);–subplot(1,2,2),imshow(fruits2);数字图像处理1、点运算•线性点运算–rice=imread('rice.png');–I=double(rice);–J=-1*I;–subplot(1,2,1),imshow(rice,[]);–subplot(1,2,2),imshow(J,[]);数字图像处理1、点运算•线性点运算–fruits=imread('fruits.jpg');–I=double(fruits);–J=-1*I+255;–fruits2=uint8(J);–subplot(1,2,1),imshow(fruits,[]);–subplot(1,2,2),imshow(fruits2,[]);数字图像处理1、点运算•非线性点运算–非线性点运算对应于非线性的灰度变换函数。–左图为几种单调非减灰度变换函数,它们都有正斜率,因而可以保留图像的基本外貌,但图像局部对比度会发生变化。输入输出0255255()()mfxxCxDxC>0:中间灰度增加C<0:中间灰度减小C=0:无变化Dm:灰度级上限数字图像处理1、点运算•非线性点运算–非线性点运算对应与非线性的灰度变换函数。–右图为几种单调非减灰度变换函数,它们都有正斜率,因而可以保留图像的基本外貌,但图像局部对比度会发生变化。输入输出0255255()()mfxxCxDxC>0:中间灰度增加C<0:中间灰度减小C=0:无变化Dm:灰度级上限11()1sin22sin2mmDxfxD降低较亮及较暗物体的对比度,加强中间灰度级物体的对比度。0<<111()1tan22tan2mmDxfxD压低中间灰度级物体的对比度,加强较亮及较暗物体的对比度。0<<1数字图像处理Photoshop软件中Image/Adjust/Curves调整选项的几种情况。1、点运算数字图像处理主要内容•1、点运算•2、邻域操作数字图像处理2、邻域操作•邻域运算–输出目标图像G的像素值取决于输入原图像F的像素值及其某个邻域内的像素值。•邻域大小–邻域是一个远小于图像尺寸、形状规则的像素块,例2×2、3×3的正方形,或用来近似表示圆及椭圆等形状的多边形。一幅图像所定义的所有邻域应大小相同。•邻域类型–滑动邻域操作、分离邻域操作。数字图像处理2、邻域操作•滑动邻域操作–方式–该操作一次处理一个像素,输出图像的每一个像素都是通过对输入图像某邻域内的像素值采用某种代数运算得到的。右图说明了一个6×5矩阵中3个元素的2×3滑动邻域,每一个邻域的中心像素都用一个黑点标出。数字图像处理2、邻域操作•滑动邻域操作–中心像素–是输入图像真正要进行处理的像素。如果邻域含有奇数行和列,那么中心像素就是邻域的真实中心;如果行或列有一维为偶数,那么中心像素将位于中心偏左或偏上方。表示为:floor(([m,n]+1)/2)数字图像处理2、邻域操作•滑动邻域操作–中心像素•例如,而下图所示的2×3邻域的中心像素为(1,2),即位于邻域中第二列、第一行的像素。数字图像处理2、邻域操作•滑动邻域操作–实现步骤•选择原图一个像素•确定该像素的邻域•用一个函数对邻域内的像素求值并返回标量结果•在输出图像对应的位置填入计算值•重复计算,遍及所有像素数字图像处理2、邻域操作•滑动邻域操作–nlfilter滑动邻域操作函数•格式B=nlfilter(A,[mn],fun)•说明–A为输入图像,B为输出图像,邻域尺寸为m×n,fun为运算函数•其它–mean-求向量的平均值,mean2-求矩阵的平均值–std-求向量的的标准差,std2-求矩阵的标准差。–median-求向量的中值–max-求向量的最大值–min-求向量的最小值–var-求向量的方差•可以用inline自定义函数。数字图像处理2、邻域操作•滑动邻域操作–用函数mean作滑动处理•CLF•I=imread('tire.tif');•I2=nlfilter(I,[55],'mean2');•subplot(121),imshow(I,[]);•subplot(122),imshow(I2,[]);数字图像处理2、邻域操作•滑动邻域操作–colfilt快速邻域操作函数•格式B=colfilt(A,[mn],'sliding',fun)•说明–多一个参数'sliding',指定该函数作滑动邻域操作。这种操作称为列处理,加快操作速度。数字图像处理2、邻域操作•原始图像中的每一个像素都对应于colfilt函数所创建的临时矩阵的一个单独列,该列包含该像素邻域内的所有数值。数字图像处理2、邻域操作•滑动邻域操作–快速滑动邻域操作•CLF•I=imread('tire.tif');•I2=colfilt(I,[55],'sliding','mean');•subplot(121),imshow(I,[]);•subplot(122),imshow(I2,[]);数字图像处理2、邻域操作•滑动邻域操作–im2col、col2im列操作函数•格式图像排成列B=im2col(A,[mn],'sliding')列重构图像B=col2im(A,[mn],[mm,nn],'sliding')数字图像处理2、邻域操作•滑动邻域操作–快速滑动邻域操作•CLF•I=imread('tire.tif');•I1=im2col(I,[33],'sliding');•I1=uint8([0-10-14-10-10]*double(I1));•I2=col2im(I1,[3,3],size(I),'sliding');•subplot(121),imshow(I,[]);•subplot(122),imshow(I2,[]);数字图像处理2、邻域操作•分离邻域操作–方式–分离邻域操作也称图像的块操作。将矩阵划分为m×n后得到矩形。–分离邻域从左上角开始覆盖整个矩阵,邻域之间没有重叠部分。如果分割的邻域不能很好地适应图像的大小,那么需要为图像进行零填充。数字图像处理2、邻域操作•分离邻域操作–方式–下图说明了一个被划分为9个4×8邻域的11×22矩阵,零填充过程将数值0添加到图像矩阵所需的底部和右边,此时图像矩阵大小变为12×24。数字图像处理2、邻域操作•分离邻域操作–blkproc图像块操作函数•格式B=blkproc(A,[mn],fun)•说明–与滑动操作不同的是整块操作。数字图像处理2、邻域操作•分离邻域操作–图像块操作•CLF•I=imread('tire.tif');•f=inline('mean2(x)*ones(size(x))');•I2=blkproc(I,[88],f);•subplot(1,2,1),imshow(I,[])•subplot(1,2,2),imshow(I2,[])数字图像处理2、邻域操作•分离邻域操作–colfilt快速块操作函数•格式B=colfilt(A,[mn],'distinct',fun)•说明–参数'distinct',说明该函数作快速块操作。数字图像处理2、邻域操作•将输入图像的每一个邻域进行重新排列来创建一个临时矩阵,在此之前如果必要会对原始图像进行零填充。数字图像处理2、邻域操作•分离邻域操作–图像块操作•CLF•I=imread('tire.tif');•f=inline('ones(64,1)*mean(x)');•I2=colfilt(I,[88],'distinct',f);•subplot(1,2,1),imshow(I,[])•subplot(1,2,2),imshow(I2,[])数字图像处理2、邻域操作•分离邻域操作–im2col、col2im列操作函数•格式图像排成列B=im2col(A,[mn],‘distinct’)列重构图像B=col2im(A,[mn],[mm,nn],'distinct')数字图像处理2、邻域操作•滑动邻域操作–用列操作函数实现块操作•CLF•I=imread('tire.tif');•I1=im2col(I,[88],'distinct');•I1=ones(64,1)*mean(I1);•I2=col2im(I1,[8,8],size(I),'distinct');•subplot(121),imshow(I,[]);•subplot(122),imshow(I2,[]);数字图像处理2、邻域操作--特定区域处理•特定区域处理•要对特定的区域进行处理时,需要定义感兴趣的区域。Matlab中,对这个区域的定义通过一个二值图像(与原始图像大小相等)来实现。称为mask图像。所要选定的区域,在相应的mask图中值为1,否则为0。数字图像处理2、邻域操作--特定区域处理•1)多边形选择法–用roipoly函数来设置一个多边形区域。•格式BW=roipoly(I,c,r)•说明–用矢量c、r来指定多边形各定点的x、y坐标•格式BW=roipoly(I)•说明–交互选择多边形数字图