说明:不要直接使用MATLAB(或者OPENCV、PYTHON等)所带的图像处理函数,重点考察大家是否理解了各种处理算法。读写图像、显示图像等可直接使用库函数。若自己编程实现了某功能,则应与直接调用库函数的方法进行对比,看结果是否一致,运行速度如何。
什么是图像的空间分辨率?
直观上看,空间分辨率是图像中可辨别的最小细节的度量。在数量上,空间分辨率可以有很多方法来说明,其中每单位距离线对数和每单位距离点数(像素数)是最通用的度量。空间分辨率度量用每英寸点数(DPI)来表示。空间分辨率越大,图片效果越好。
什么是密度(灰度)分辨率?
灰度分辨率是指在灰度级中可分辨的最小变化。灰度分辨率指的是色阶,色阶是表示图像亮度强弱的指数标准,也就是我们说的色彩指数。灰度分辨率指亮度,和颜色无关,但最亮的只有白色,最不亮的只有黑色。灰度分辨率表示:常用2的整数次幂,最常用是2的8次方=256。
在图像取样和量化中,DPI (Dots Per Inch)或者PPI(pixels per inch)与空间分辨率有何关系?
DPI(dots per inch):打印分辨率(每英寸所能打印的点数,即打印精度)
PPI(pixels per inch):图像的采样率(在图像中,每英寸所包含的像素数目)
空间分辨率与图像采样相结合,采样对应空间分辨率.
灰度分辨率与图像量化相结合,量化对应灰度分辨率.
对坐标值进行数字化称为取样,对幅值数字化称为量化。
对一幅图像,当量化级数一定时,采样点数对图像质量有着显著的影响。采样点数越多,图像质量越好; 当采样点数减少时,图上的块状效应就逐渐明显。
同理,当图像的采样点数一定时,采用不同量化级数的图像质量也不一样。量化级数越多,图像质量越好,当量化级数越少时,图像质量越差,量化级数最小的极端情况就是二值图像,图像出现假轮廓.
设一幅大小为M×N的灰度图像I中,现要变成(放大或缩小)为 P×Q的图像J,请写出J的生成算法。【参考函数:imresize】
算法的具体步骤如下: 假设原图像大小为 M ∗ N M*N M∗N, 其中 M M M 和 N N N 分别为原始图像的行数与列数。若图像的缩放因子为 t ( t > 0 ) t(t > 0) t(t>0), 则目标图像大小 s i z e = t ∗ m ∗ t ∗ n size=t*m*t*n size=t∗m∗t∗n。对于目标图像的某个像素点 P ( x , y ) P(x, y) P(x,y), 通过 P ∗ 1 / t P*1/t P∗1/t 可以得到对应的原始图像坐标 P ′ ( x 1 , y 1 ) P'(x_1,y_1) P′(x1,y1), 其中 x 1 = x / t , y 1 = y / t x_1= x/t, y_1= y /t x1=x/t,y1=y/t, 考虑到 x 1 , y 1 x_1, y_1 x1,y1 都不是整数而不存在这样的点, 因此可以找出与它相临的四个点的灰度 f 1 , f 2 , f 3 , f 4 f_1,f_2,f_3,f_4 f1,f2,f3,f4, 使用双线性插值算法便得到了该像素点 P ′ ( x 1 , y 1 ) P'(x_1, y_1) P′(x1,y1) 的灰度, 也即像素 P ( x , y ) P(x, y) P(x,y) 的灰度.
完整算法描述如下:
设一幅大小为M×N的灰度图像I中,现要将其逆时针旋转 A度,得到图像J,请写出J的生成算法。【应含多种角度,锐角、钝角;应有灰度图像及彩色图像的旋转】【参考函数:imrotate】
图像变换包括两个基本操作:
坐标变化的具体步骤如下:
先将原图的图像坐标系转换为数学坐标系
假设某个点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)图像的宽为 M M M,高为 N N N。转换成旋转变换的空间坐标变换:
[ x 1 y 1 1 ] = [ x 0 y 0 1 ] [ 1 0 0 0 − 1 0 − 0.5 M 0.5 N 1 ] \begin{bmatrix}x_1&y_1&1 \end{bmatrix} =\begin{bmatrix}x_0&y_0&1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ -0.5M & 0.5N & 1\end{bmatrix} [x1y11]=[x0y01]⎣ ⎡10−0.5M0−10.5N001⎦ ⎤
在数学坐标系下使用旋转坐标变换矩阵进行旋转计算
[ x 2 y 2 1 ] = [ x 1 y 1 1 ] [ cos A sin A 0 sin A − cos A 0 0 0 1 ] \begin{bmatrix}x_2&y_2&1 \end{bmatrix} =\begin{bmatrix}x_1&y_1&1 \end{bmatrix} \begin{bmatrix} \cos A & \sin A & 0 \\ \sin A & -\cos A & 0 \\ 0 & 0 & 1\end{bmatrix} [x2y21]=[x1y11]⎣ ⎡cosAsinA0sinA−cosA0001⎦ ⎤
再将坐标转变回图像坐标系, M ′ M' M′表示旋转后图像的宽, N ′ N' N′表示旋转后图像的高
[ x 3 y 3 1 ] = [ x 2 y 2 1 ] [ 1 0 0 0 − 1 0 0.5 M ’ 0.5 N ′ 1 ] \begin{bmatrix}x_3&y_3&1 \end{bmatrix} =\begin{bmatrix}x_2&y_2&1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ 0.5M’ & 0.5N' & 1\end{bmatrix} [x3y31]=[x2y21]⎣ ⎡100.5M’0−10.5N′001⎦ ⎤
像素灰度赋值主要有最近邻插值和双线性插值. 一般使用效果更好的双线性插值方法.
在图像几何变换中,最近邻插值、双线性插值的基本原理是什么?如何实现?
最近邻插值:
在四个像素点上划分为四个区域 A B C D 如下图所示, 然后插值到 A 区域的点,其像素值等于坐标 ( i , j ) (i,j) (i,j) 的像素值,插值到 B 区域的点,其像素值等于坐标 ( i + 1 , j ) (i+1,j) (i+1,j) 的像素值,插值到 C 区域的点,其像素值等于坐标 ( i , j + 1 ) (i, j+1) (i,j+1) 的像素值,插值到 D 区域的点,其像素值等于坐标 ( i + 1 , j + 1 ) (i+1, j+1) (i+1,j+1) 的像素值。
双线性插值:
是由两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。已知 Q 11 ( x 1 , y 1 ) , Q 12 ( x 1 , y 2 ) , Q 21 ( x 2 , y 1 ) , Q 22 ( x 2 , y 2 ) Q_{11}(x_{1}, y_{1}),\enspace Q_{12}(x_{1}, y_{2}),\enspace Q_{21}(x_{2}, y_{1}), \enspace Q_{22}(x_{2}, y_{2}) Q11(x1,y1),Q12(x1,y2),Q21(x2,y1),Q22(x2,y2) 四个点的像素值 ,现在要求点P的像素值;先根据点 Q 12 Q_{12} Q12 Q 22 Q_{22} Q22求出 R 2 R_2 R2 的像素值以及根据点 Q 11 Q_{11} Q11 Q 21 Q_{21} Q21求出 R 1 R_1 R1 的像素值,然后根据 R 2 R_2 R2 R 1 R_1 R1的像素值求出 P 的像素值,其过程分为两次单线性插值求出 P 的像素值。
在 x 方向做插值:
f ( R 1 ) = f ( x , y 1 ) ≈ x 2 − x x 2 − x 1 f ( Q 11 ) + x − x 1 x 2 − x 1 f ( Q 21 ) f(R_1)=f(x,y_1)\approx\frac{x_2-x}{x_2-x_1}f(Q_{11})+\frac{x-x_1}{x_2-x_1}f(Q_{21}) f(R1)=f(x,y1)≈x2−x1x2−xf(Q11)+x2−x1x−x1f(Q21)
f ( R 2 ) = f ( x , y 2 ) ≈ x 2 − x x 2 − x 1 f ( Q 12 ) + x − x 1 x 2 − x 1 f ( Q 22 ) f(R_2)=f(x,y_2)\approx\frac{x_2-x}{x_2-x_1}f(Q_{12})+\frac{x-x_1}{x_2-x_1}f(Q_{22}) f(R2)=f(x,y2)≈x2−x1x2−xf(Q12)+x2−x1x−x1f(Q22)
在 y 方向做插值:
f ( x , y ) ≈ y 2 − y y 2 − y 1 f ( R 1 ) + y − y 1 y 2 − y 1 f ( R 2 ) f(x,y)\approx\frac{y_2-y}{y_2-y_1}f(R_1)+\frac{y-y_1}{y_2-y_1}f(R_2) f(x,y)≈y2−y1y2−yf(R1)+y2−y1y−y1f(R2)
综合起来:
f ( x , y ) ≈ y 2 − y y 2 − y 1 f ( R 1 ) + y − y 1 y 2 − y 1 f ( R 2 ) = y 2 − y y 2 − y 1 ( x 2 − x x 2 − x 1 f ( Q 12 ) + x − x 1 x 2 − x 1 f ( Q 22 ) ) + y − y 1 y 2 − y 1 ( x 2 − x x 2 − x 1 f ( Q 12 ) + x − x 1 x 2 − x 1 f ( Q 22 ) ) \begin{aligned} f(x,y)&\approx\frac{y_2-y}{y_2-y_1}f(R_1)+\frac{y-y_1}{y_2-y_1}f(R_2)\\ &=\frac{y_2-y}{y_2-y_1}(\frac{x_2-x}{x_2-x_1}f(Q_{12})+\frac{x-x_1}{x_2-x_1}f(Q_{22}))+\frac{y-y_1}{y_2-y_1}(\frac{x_2-x}{x_2-x_1}f(Q_{12})+\frac{x-x_1}{x_2-x_1}f(Q_{22})) \end{aligned} f(x,y)≈y2−y1y2−yf(R1)+y2−y1y−y1f(R2)=y2−y1y2−y(x2−x1x2−xf(Q12)+x2−x1x−x1f(Q22))+y2−y1y−y1(x2−x1x2−xf(Q12)+x2−x1x−x1f(Q22))
设一幅大小为 M×N 的灰度图像 I 中,灰度为 g 的像素数为 h(g), 0 ≤ g ≤ 255 0\leq g\leq 255 0≤g≤255. 请写出对图像I进行直方图均衡化,得到图像 J 的计算方法。【参考函数:histeq】
代码:
%I=imread('tire.tif');myhisteq(I);
function [out_image ] = myhisteq(input_image )
% input_mage输入图像,out_image直方图均衡化后的图像
[h,w]=size(input_image);num=zeros(1,256);out_image=input_image;
for i=1:h
for j=1:w
k = input_image(i,j);
num(k+1)= num(k+1)+1;
end
end
num = num/(h*w);
for i=2:256
num(i)=num(i-1)+num(i);
end
num = uint8(255 * num+0.5);
for i=1:h
for j=1:w
out_image(i,j)=num(input_image(i,j)+1);
end
end
end
设一幅大小为M×N的灰度图像I中,灰度为g的像素数为h(g), 0 ≤ g ≤ 255 0\leq g\leq 255 0≤g≤255。另给定一个直方图t(g), 0 ≤ g ≤ 255 0\leq g\leq 255 0≤g≤255 。 请写出对图像I进行变换的方法,使得变换后的新图像的直方图与t相同(近似相等)。
代码:
function [out_image] = myhismap(input_image,match_image,option)
% option=1表示选择单映射规则(SML);option=2表示选择组映射规则(GML)
[h1,w1]=size(input_image);[h2,w2]=size(match_image);
num_image=zeros(1,256);num_match=zeros(1,256);
for i=1:h1
for j=1:w1
num_image(input_image(i,j)+1)=num_image(input_image(i,j)+1)+1;
end
end
for i=1:h2
for j=1:w2
k = match_image(i,j);
num_match(k+1)= num_match(k+1)+1;
end
end
num_image = num_image/(h1*w1);num_match = num_match/(h2*w2);
for i=2:256
num_image(i)=num_image(i-1)+num_image(i);num_match(i)=num_match(i-1)+num_match(i);
end
num_image=uint8(255 * num_image+0.5);num_match = uint8(255 * num_match+0.5);
out_image=input_image;
if option == 1
dist=zeros(256,256);
for i = 1:256
for j=1:256
dist(i,j)=abs(num_image(i)-num_match(j));
end
end
[m,index] = min(dist,[],2);
index = index -1;
for i=1:h1
for j=1:w1
out_image(i,j)=index(input_image(i,j)+1);
end
end
else if option ==2
index = zeros(1,256);
for i=1:256
if num_match(i) ~= 0
temp=1;
m=abs(num_match(i)-num_image(1));
for j = 2:256
k = abs(num_match(i)-num_image(j));
if k
请描述自适应直方图均衡化的实现算法。
移动模板 W W W 在图像 A A A 上逐行移动,并且模板 W W W 的中心 c ( x 0 , y 0 ) c(x_0,y_0) c(x0,y0) 对应图像上的点 f ( x 0 , y 0 ) f(x_0,y_0) f(x0,y0);计算模板 W W W 区域的直方图均衡化变化关系: g ( x , y ) = T ( f ( x , y ) ) g(x,y)= T(f(x,y)) g(x,y)=T(f(x,y)),计算模板中心点 c ( x 0 , y 0 ) c(x_0,y_0) c(x0,y0) 的均衡化对应像素值: g ( x 0 , y 0 ) = T ( f ( x 0 , y 0 ) ) g(x_0,y_0) = T(f(x_0,y_0)) g(x0,y0)=T(f(x0,y0))。用 g ( x 0 , y 0 ) g(x_0,y_0) g(x0,y0) 替代 f ( x 0 , y 0 ) f(x_0,y_0) f(x0,y0); 逐行计算得到整幅图像的自适应直方图均衡化图像。
将图片分割成多个块(块的大小可以自定义,一般设定8×8的块,无法整除可以使用边界填充padding),然后遍历计算各个块的像素的灰度累积分布函数,最后使用插值方法来计算每个像素点对应的变换灰度。具体插值计算如下图所示:
图中将原图划分为4×4区域,它可以分为三类:蓝色像素区域表示图像的中间部分,红色像素区域是图像的四个角,绿色像素区域是图像边缘部分。蓝色区域的像素点采用相邻四个区域的灰度变换的双线性插值,绿色部分使用相邻两区域的灰度变换的线性插值,红色部分直接使用块所在的累积灰度变换函数。
设有一细胞图像,图像中大部分像素为较黑的背景,细胞中含有灰度不同的成份,若想更好的看清细胞部分,能否使用直方图均衡化方法,为什么?
可以用直方图均衡化的方法。理由如下:
当图像的灰度分布不均匀,出现过亮过暗,或者对比度过低的情况时,图像细节不明显,肉眼观察时会丢失一些信息。这时可以使用直方图均衡技术对图像进行变换,变成肉眼易于分辨的细节分明的图像。直方图均衡导致的对比度增强足以补偿图像在视觉上难以区分灰度级的差别。在给出原始图像间的重要对比度差别后,该例说明了直方图均衡作为自适应对比度增强工具的强大作用。
设一幅图像整体偏暗,在暗区中不同对象较难分辨。为了增强暗区中的对象,应选用灰度的对数变换,还是指数变换?灰度变换的公式是什么?
应选用灰度的对数变换,对数变换将图像的低灰度值部分扩展,将其高灰度值部分压缩,以达到强调图像低灰度部分的目的;同时可以很好地压缩像素值变化较大的图像的动态范围,目的是突出需要的细节。
灰度对数变换公式: s = c log ( 1 + r ) s=c\log(1+r) s=clog(1+r)
灰度指数变换公式: s = c r γ s= cr^\gamma s=crγ
对一幅灰度图像,给出灰度分段线性变换方法,使得新图像中 5% 的像素的灰度变为 0, 5%的像素灰度变为 255。
设图像大小为 M × N M\times N M×N,5%的像素个数为 5 % × M × N 5\%\times M\times N 5%×M×N,记为 A A A。