编程语言
C#编程语言基础
C#面向对象与多线程
C#数据及文件操作
JavaScript基础
JavaScript的数据类型和变量
JavaScript的运算符和表达式
JavaScript的基本流程控制
JavaScript的函数
JavaScript对象编程
JavaScript内置对象和方法
JavaScript的浏览器对象和方法
JavaScript访问HTML DOM对象
JavaScript事件驱动编程
JavaScript与CSS样式表
Ajax与PHP
ECMAScript6的新特性
Vue.js前端开发
PHP的常量与变量
PHP的数据类型与转换
PHP的运算符和优先规则
PHP程序的流程控制语句
PHP的数组操作及函数
PHP的字符串处理与函数
PHP自定义函数
PHP的常用系统函数
PHP的图像处理函数
PHP类编程
PHP的DataTime类
PHP处理XML和JSON
PHP的正则表达式
PHP文件和目录处理
PHP表单处理
PHP处理Cookie和Session
PHP文件上传和下载
PHP加密技术
PHP的Socket编程
PHP国际化编码
MySQL数据库基础
MySQL数据库函数
MySQL数据库账户管理
MySQL数据库基本操作
MySQL数据查询
MySQL存储过程和存储函数
MySQL事务处理和触发器
PHP操作MySQL数据库
数据库抽象层PDO
Smarty模板
ThinkPHP框架
Python语言基础
Python语言结构与控制
Python的函数和模块
Python的复合数据类型
Python面向对象编程
Python的文件操作
Python的异常处理
Python的绘图模块
Python的NumPy模块
Python的SciPy模块
Python的SymPy模块
Python的数据处理
Python操作数据库
Python网络编程
Python图像处理
Python机器学习
TensorFlow深度学习
Tensorflow常用函数
TensorFlow用于卷积网络
生成对抗网络GAN
数字图像处理的过程就是对图像数据的一种运算过程。从技术上,图像处理的过程分为空间域和频率域处理。
1. 图像的点运算:
点运算将输入图像映射为输出图像,输出图像每个像素点的灰度值仅由对应的输入像素点的值决定。它常用于改变图像的灰度范围及分布,是图像数字化及图像显示的重要工具。
点运算实际上是灰度到灰度的映射过程,根据作用性质,也被称为对比度增强、对比度拉伸或灰度变换等。点运算不会改变图像内像素点之间的空间关系,直方图均衡化和直方图规范化都是点运算的典型应用,还有图像增强等。
常用的像素统计特性函数有:
均值函数mean2:B=mean2(A) ---- 计算图像A的均值B
标准差函数std2:b=std2(A) ---- 计算图像A的标准差b
相关系数corr2:r=corr2(A, b) ---- 计算图像A和B的相关系数
图像直方图函数imhist:imhist(I, n)和imhist(X, map)
图像亮度增亮或变暗函数brighten:brighten(beta)和brighten(h, beta)
直方图均衡增强亮度函数histeq:J=histeq(I, hgram)和newmap=histeq(X, map)
点运算包括线性点运算和非线性点运算,非线性点运算包括平方函数、对数函数、截取窗口函数、阈值函数、多值量化函数等。
2. 图像的代数运算:
代数运算是指两幅或多个输入图像之间进行点对点的加、减、乘、除等运算得到输出图像,这也是点运算的典型应用。代数运算不存在空间位置的变换,可以把代数运算理解为数组的运算。
1)加法运算:
图像相加一般用于对同一场景的多重影像叠加求平均图像,以便有效地降低加性随机噪声,在遥感图像中经常采用。imadd函数实现图像相加运算,格式:
Z=imadd(X, Y) ---- 对X和Y数组中对应元素相加,返回值Z和X、Y大小一致,若Y为标量,则对X数组中每个元素相加这个变量。
对图像的像素点值进行相加操作时,其结果很可能超过图像数据类型所支持的最大值。当数据发生溢出时,imadd函数会将截取为数据类型的最大值,这种截取效果称之为饱和处理。为了避免这种溢出情况,可以把数据类型转换成更宽的数据类型。
2)噪声添加函数:
MATLAB还提供了噪声添加函数imnoise,方便模拟噪声信息。这个函数也相当于图像相加:
J=imnoise(I, type)
J=imnoise(I, type, parameters)
J=imnoise(I, 'gaussian', m, v)
J=imnoise(I, 'localvar', V)
J=imnoise(I, 'localvar', image_intensity, var)
J=imnoise(I, 'poisson')
J=imnoise(I, 'salt&pepper', d)
J=imnoise(I, 'speckle', v)
Type对应的噪声类型:
参数值 |
说明 |
gaussian |
高斯白噪声,参数m、v分别表示均值和方差 |
localvar |
0均值高斯白噪声,参数v表示局部方差 |
poisson |
泊松噪声 |
salt & pepper |
盐椒噪声,参数d表示噪声密度 |
speckle |
乘性噪声 |
3)减法运算:
图像相减是常用的图像处理方法,用于检测变化及运动物体。MATLAB使用图像数组直接相减来实现,或用imsubtract函数和imabsdiff函数运算。格式:
Z=imsubtract(X, Y)
Z=imabsdiff(X, Y)
4)乘法运算:
乘法运算可以用来实现掩模处理,即屏蔽掉图像的某些部分。此外由于时域卷积和相关运算与频域的乘积运算对应,因此乘法运算有时也被用来作为一种技巧来实现卷积或相关处理。
MATLAB中用immultiply函数实现图像的乘法运算,格式为:
Z=immultiply(X,Y)
5)除法运算:
除法运算可用于校正成像设备的非线性影响,在医学图像处理中可以用到。图像像素点的除法运算可以检测图像之间的差别,但除法运算主要是像素值的比率变化,因此也称为比率变换。MATLAB中用imdivide函数实现图像的除法运算,格式为:
Z=imdivide(X, Y)
6)线性运算:
线性运算是图像的四则运算的汇总,因此可以使用加、减、乘、除函数组合起来。调用格式:
Z=imlincomb(K1,A1,K2,A2, ... ,Kn,An) ---- 计算关系式K1*A1+K2*A2+...+Kn*An
Z=imlincomb(K1,A1,K2,A2, ... ,Kn,An,K) ---- 计算关系式K1*A1+K2*A2+...+Kn*An+K
Z=imlincomb(... ,output_class) ---- 参数output_class用字符串来设定输出Z的类型,如uint8
7)非线性运算:
线性运算中,像素点间值的变化是一种比例关系。实际中,需要对某个图像特性进行放大或缩小,特别是进行图像增强过程中,为了消除图像失真,非线性运算就特别有用。幂运算、指数运算、对数运算、根运算等是最为简单的非线性映射算法。
3. 图像的逻辑运算:
图像的逻辑运算在图像增强、图像识别、图像复原和区域分割等领域有着广泛的应用,逻辑运算不仅关注于图像像素点的数值变换,而重在位变换的情况。MATLAB提供了一些逻辑运算函数:
函数 |
说明 |
函数 |
说明 |
bitand |
位与 |
bitor |
位或 |
bitcmp |
位补 |
bitxor |
位异或 |
bitshift |
位移位 |
imcomplement |
补运算 |
示例:
I3=bitand(I1,I2)
IM2=imcomplement(IM);
不同数据类型的等价运算:
IM的类型 |
说明 |
IM的类型 |
说明 |
双精度类型 |
等价于1-IM |
16位无符号整型 |
等价于65535-IM |
8位无符号整数 |
等价于255-IM |
逻辑类型 |
等价于~IM |
4. 图像的几何运算:
几何运算可改变图像中物体之间的空间关系,这种运算可以看成将各像素在图像内移动的过程。
1)图像插值:
在图像处理领域主要是二维插值。插值通常是利用曲线拟合的方法,通过离散的采样点建立一个连续函数,用这个创建的函数就可以求出任意位置的函数值。MATLAB提供了三种拟合方法:
⑴ 最近邻插值:Nearest neighbor interpolation
⑵ 双线性插值:Bilinear interpolation
⑶ 双三次插值:Bicubic interpolation
假设输出图像的宽度为W高度为H,输入图像的宽度为w高度为h,要将输入图像的尺寸拉伸或压缩变换至输出图像的尺寸。
按照线性插值的方法,将输入图像的宽度方向分为W等份,高度方向分为H等份,那么输出图像中任意一点(x, y)的灰度值就应该由输入图像中四点(a, b)、(a+1, b)、(a, b+1)、(a+1, b+1)的灰度值确定:
f(x, y)=(b+1 -y)f(x, b)+(y-b)f(x, b+1)
f(x, b+1)=(x-a)f(a+1, b+1)+(a+1-x)f(a, b+1)
式中,f(x, b)=(x-a)f(a+1, b)+(a+1-x)f(a b)
用interp2函数来执行二维数据的插值运算。调用格式:
ZI=interp2(X, Y, Z, XI, YI) ---- 对X、Y、Z定义的二维数组进行对应于XI和YI的插值运算返回数组ZI。X和Y必须具有单调性、相同的格式。返回值ZI关联于点(XI(i, j), YI(i, j))。
ZI=interp2(Z, XI, YI) ---- 默认X=1:n、Y=1:m,这里[m, n]=size(Z)
ZI=interp2(Z, ntimes) ---- 应用递归ntimes次把每个元素交错插值扩展Z,默认值1
ZI=interp2(X, Y, Z, XI, YI, method) ---- 参数method定义了选择插值的方法
ZI=interp2(... , method, extrapval)
参数method定义的插值方法有:
nearest |
最近邻插值 |
spline |
三次样条插值 |
linear |
双线性插值(默认) |
cubic |
立方插值 |
2)图像缩放:
用imresize函数可以改变图像的大小。格式为:
B=imresize(A, scale) ---- scale指定缩放比例
B=imresize(A, [mrows ncols])
[Y newmap]=imresize(X, map, scale)
[...]=imresize(... , method) ---- method指定采取插值运算的方法,包括最邻近插值nearest、双线性插值bilinear、双三次插值bicubic、立方核cubic、三角核triangle等。
[...]=imresize(... , parameter, value, ...) ---- 参数对可以配置抗锯齿Antialiasing、色图优化Colormap、颜色抖动Dither、缩放比例Scale、输出大小控制OutputSize、插值运算方法Method等。
3)图像旋转:
用imrotate函数实现图像的旋转。调用格式:
B=imrotate(A, angle) ---- 参数angle表示旋转的角度
B=imrotate(A, angle, method) ---- method指定插值运算方法
B=imrotate(A, angle, method, bbox) ---- 参数bbox有crop和loose两个值,crop是剪切旋转后图像的中间部分并返回和原图大小一致的图像;loose为缺省值,返回旋转后完整大小的图像。
4)图像剪切:
对于要处理的图像,用户可能只是关心图像的部分内容,这时就要剪切部分图像,提高处理的效率。使用imcrop函数可以实现图像剪切,格式为:
I=imcrop ---- 对当前窗口中的图片显示剪切操作状态
I2=imcrop(I) ---- 对灰度图像和真彩色图像进行剪切处理,等待鼠标选定矩形剪切区域
X2=imcrop(X, map) ---- 对索引图像进行剪切处理,等待鼠标选定矩形剪切区域
I=imcrop(h)
I2=imcrop(I, rect) ----指定矩形区域rect进行剪切操作
X2=imcrop(X, map, rect) ---- 指定矩形区域rect进行剪切操作
[...]=imcrop(x, y, ...)
[I2 rect]=imcrop(...)
[X, Y, I2, rect]=imcrop(...)
5. 空间变换:
空间变换包括可用数学函数表达的简单变换,如平移、拉伸等仿射变换,也包括依赖实际图像而不易用函数形式描述的复杂变换,如对存在几何畸变的图像进行校正需要实际拍摄栅格图像并根据栅格的实际扭曲数据建立空间变换。
1)仿射变换:
仿射变换可以理解为对坐标进行放缩、旋转、平移后取得新坐标的值,经过对坐标轴的放缩、旋转、平移后原坐标在新坐标领域中的值。
仿射变换的形式为:f(x)=Ax+b
其中,A是变换矩阵,b是平移矢量。在二维空间中,A可以分解为尺度、伸缩、扭曲、旋转四种。
⑴ 尺度: S >=0
⑵伸缩:
⑶扭曲:
⑷旋转:
2)投影矩阵:
投影变换是将图像像素点的坐标转换为另一种图像像素点的坐标。用笛卡尔坐标表达时是平面的分式线性变换:
3)空间变换函数:
⑴ 创建空间变换结构maketform:(新版本建议不要使用,而使用AFFINE2D等函数)
MATLAB中用maketform函数创建空间变换结构。函数调用格式为:
T=maketform(transformtype, ...) ---- 创建空间变换结构
T=maketform('affine', A)
T=maketform('affine', A, U)
T=maketform('projective', A)
T=maketform('projective', U, X)
T=maketform('custom', NDIMS_IN, NDIMS_OUT, FORWARD_FCN, INVERSE_FCN, TDATA)
T=maketform('box', tsize, LOW, HIGH)
T=maketform('box', INBOUNDS, OUTBOUNDS)
T=maketform('composite', T1, T2, ... TL)
T=maketform('composite', [T1 T2 ... TL])
可以由cp2tform函数根据匹配点对来生成变换结构。transformtype对应值有:
参数 |
说明 |
参数 |
说明 |
'affine' |
二维或多维仿射变换 |
'custom' |
M维到N维的自定义变换 |
'projective' |
二维或多维投影变换 |
'box' |
在各维上独立进行仿射变换 |
'composite' |
多种变换的组合变换 |
|
|
⑵ 对图像进行空间变换imtransform函数:(新版本建议使用imwarp)
B=imtransform(A, TFORM) ---- 按照指定的二维空间变换结构TFORM对图像进行空间变换
B=imtransform(A, TFORM, INTERP) ---- INTERP指定插值形式,为nearest、bilinear、bicubic或是makeresampler函数的返回值。
[B, XDATA, YDATA]=imtransform(...) ---- 返回输出X-Y空间上的输出图像B的位置,XDATA和 YDATA是二元向量,XDATA指定X轴上图像B的第1列和最后1列,YDATA指定了Y轴上图像B的第1列和最后1列。通常,函数会自动计算出XDATA和YDATA,也就是图像的坐标轴显示的范围,以便让图像B包含完整的图像A变换后的信息。
[B, XDATA, YDATA]=imtransform(... ,PARAM1, VAL1, PARAM2, VAL2, ...) ---- 指定空间变换的参数
6. 邻域操作:
图像的邻域是指以像素点为中心相关的一系列像素点集。像素点的邻域是一个矩形块,常见的大小是3x5、5x5、7x7等。图像的邻域操作是指用像素点的邻域进行运算后的新值作为输出新图像的像素点值。由于使用这种方法进行图像处理时一般使用算子模块逐行(或逐列)在图像上滑动,在滑动的过程中用算子模块和经过的区域进行运算,因此有时这种操作也加滑动邻域操作。对于任何一个mxn的邻域,中心像素点为floor(([m n]+1)/2)。
执行滑动邻域的操作步骤:
·选择一个单的像素
·决定像素的邻域
·应用函数计算邻域中心像素点的值,函数必须返回标量
·寻找输入图像中心像素点相关位置上的输出图像像素点,设置输出像素点为函数返回值
·对图像每一个像素点重复这样的过程
MATLAB提供了几个邻域处理函数。
⑴ nlfilter函数:基本的邻域操作函数
B=nlfilter(A, [m n], fun)
B=nlfilter(A, 'indexed', ...)
[m n]定义滑块邻域块的大小,fun定义计算邻域中心像素点匹配函数,此函数可以是各种滤波算子,也可以是一个矩阵等。'indexed'指定图像A为索引图像。在图像邻域处理过程中,若遇到边界像素点,滑动的邻域块在图像外用0填充。
nlfilter函数由于是按每个像素点依次进行滑动处理分析,因此对大图像处理很慢。
⑵ colfilt函数:能够在每个图像块进行滑动邻域处理
B=colfilt(A, [m n], block_type, fun)
B=colfilt(A, [m n], [mblock nblock], block_type, fun, ...)
B=colfilt(A, 'indexed', ...)
函数中,用block_type参数来定义处理图像邻域的方式:
·distinct:大小为[mblock nblock]图像块,邻域操作过程中逐图像块进行滑动
·sliding:按逐像素点滑动,等价于单像素点图像块
在colfilt函数进行邻域处理之前,先用im2col函数把图像数组以图像块重新排列为列向量的方式。im2col函数调用格式为:
B=im2col(A, [m n], block_type)
b=im2col(A, 'indexed', ...)
在colfilt函数邻域处理后,再用col2im重排列向量为块图像。调用格式为:
B=col2im(A, [m n], [mm nn], 'distinct')
B=col2im(A, [m n], [mm nn], 'sliding')
colfilt函数邻域处理的distinct方式其实就是分离块的操作。
⑶ blkproc函数:与colfilt函数的distinct方式类似
B=blkproc(A, [m n], fun)
B=blkproc(A, [m n], [mborder nborder], fun)
B=blkproc(A, 'indexed', ...)
bestblk函数在MATLAB中用来对图像进行分离块处理并计算最优化块大小。
7. 区域处理:
1)区域选择:
⑴ roicolor函数:根据颜色选定区域
BW=roicolor(A, low, hight) ---- 色图范围为[low high],返回这些像素选择区域,BW是内部区域值为1外部为0的矩阵
BW=roicolor(A, v) ---- 返回A中像素与向量v匹配的区域,BW为二值图像,若A中像素值在向量v中存在则返回1,否则返回0
⑵ roipoly函数:用于选择图像中多边形区域
BW=roipoly ---- 直接对当前图像窗口进行交互式操作,通过鼠标键盘控制选择
BW=roipoly(I) ---- 为图像生成交互式处理界面
BW=roipoly(I, c, r) ---- 用向量c、r指定多边形各点的X、Y坐标,BW选中区域为1
BW=roipoly(x, y, I, xi, yi) ---- 用矢量x、y建立非缺省坐标系,然后在指定坐标系下选择由向量xi、yi指定的多边形区域
[BW, xi, yi]=roipoly(...)
[x, y, BW, xi, yi]=roipoly(...)
交互式选择中,鼠标左键选择顶点,空格键或Del键取消选择,回车键确认
2)区域滤波:
roifilt2函数用于对指定的区域进行滤波。调用格式:
J=roifilt2(h,I,BW) ---- 使用滤波器h对图像I中用二值掩模BW选中区域滤波,内部调用filter2
J=roifilt2(I,BW, fun) ---- 用fun函数处理区域滤波图像I
3)区域填充:
roifill函数用于对指定区域的填充。调用格式:
J=roifill ---- 直接对当前图像窗口进行交互选择插值
J=roifill(I) ---- 为图像I生成交互式处理界面
J=roifill(I, c, r) ---- 填充向量c、r指定的多边形,c和r分别为多边形各顶点的X、Y坐标,是通过解拉普拉斯方程在多边形的边缘像素值平滑插值,此方法可用于擦除图像中小物体
J=roifill(I, BW) ---- 用BW掩模填充此区域,如果为多个多边形则分别执行插值填充
[J, BW]=roifill(...)
BW=roifill(x, y, I, xi, yi) ---- 用矢量x、y建立非缺省坐标系,然后在指定坐标系下选择由向量
[x, y, J, BW, xi, yi]=roipoly(...)