说明:不允许直接使用MATLAB (或者OPENCV 等等软件)所带的图像图像函数,
重点考察大家是否理解了各种处理算法,算法可用伪代码描述。算法应
较详细。
1、 设一幅大小为M ×N 的灰度图像I 中,灰度为g 的像素数为h(g), 0255g ≤≤。
请写出对图像I 进行直方图均衡化,得到图像J 的计算方法。
clc;
clear;
I= imread('');
I= rgb2gray(I) ; %将图像转换为灰度图像
J= histeq( I) ; %对I 进行直方图均衡化
subplot( 121) ,imshow(I) ,title('原始图像') ;
subplot (122), imshow(J), title('直方图均衡化后的图像');
figure( 2) ;
subplot( 121) ,imhist(I, 64), title( '原始的直方图');
subplot( 122) ,
imhist(J,64) ,
title(' 均衡化后的直方图');
2、 设一幅大小为M ×N 的灰度图像I 中,现要变成(放大或缩小)为 P ×Q 的
图像J ,请写出J 的生成算法(可以使用近邻插值)。
I=imread('');%读入图像
%图像属性
% Filename: ''
% FileModDate: '24-Aug-2008 16:50:30'
% FileSize: 20372
% Format: 'jpg'
% FormatVersion: ''
% Width: 480
% Height: 640
% BitDepth: 8
% ColorType: 'grayscale'
% FormatSignature: ''
% NumberOfSamples: 1
% CodingMethod: 'Huffman'
% CodingProcess: 'Sequential'
% Comment: {}
[rows,cols]=size(I);
K1 = str2double(inputdlg('请输入行缩放倍数', 'INPUT scale factor', 1, {''}));%行默认变为原来的倍
K2 = str2double(inputdlg('请输入列缩放倍数', 'INPUT scale factor', 1, {''}));%列默认变为原来的倍
width = K1 * rows;
height = K2 * cols;
im2 = uint8(zeros(width,height)); %定义输出图像矩阵
widthScale = rows/width;
heightScale = cols/height;
for x = 6:width - 6 %为防止矩阵溢出而选择的参数6 for y = 6:height - 6
oldX = x * widthScale; %oldX,oldY为原坐标,x,y为新坐标
oldY = y * heightScale;
if (oldX/double(uint16(oldX)) == & (oldY/double(uint16(oldY)) ==
im2(x,y) = I(int16(oldX),int16(oldY));
else
a = double(round(oldX));
b = double(round(oldY)); %若不是整数四舍五入后把临近值赋过
去
im2(x,y) = I(a,b);
end
end
end
imshow(I); %输出原图像
figure;
imshow(im2); %输出缩放后图像
3、设一幅大小为M×N的灰度图像I中,现要将其逆时针旋转 A度,得到图像
J,请写出J的生成算法(可以使用近邻插值)。
clear;%此题是用最近邻域法实现图像旋转
im1=imread('');
[m,n,p]=size(im1);
% 将图像旋转30度
a=; %a=sin30=
b=; %b=cos30=
row=n*a+m*b;
col=n*b+m*a;
for i=1:row %先把图象填充成全黑
for j=1:col
im2(i,j,:)=uint8(0);
end
end
for i=1:m %把原图象像素点旋转后变为新图象点
for j=1:n
xx=round(abs((i-m/2)*b-(j-n/2)*a+row/2));
yy=round(abs((i-m/2)*a+(j-n/2)*b+col/2));
for k=1:3
im2(xx,yy,k)=im1(i,j,k);
end
end
end
temp1=uint8(0);
temp2=uint8(0);
temp3=uint8(0);
for i=1:row %把画面上的空点按照最近邻插值法填充
temp1=uint8(0);
temp2=uint8(0);
temp3=uint8(0);
for j=1:col %找到最右的图象边界点
if (im2(i,j,:)==uint8(0))
else
kk=j;
end
end
for j=1:kk
if (im2(i,j,:)==uint8(0))
im2(i,j,1)=temp1;
im2(i,j,2)=temp2;
im2(i,j,3)=temp3;
else
temp1=im2(i,j,1);
temp2=im2(i,j,2);
temp3=im2(i,j,3);
end
end
end
imshow(im1);
figure;
imwrite(im1,''); %保存原图像
imshow(im2);
imwrite(im2,'');%保存旋转后图像
4、请写出生成(2N+1)×(2N+1)大小的高斯模板H(方差为sigma)的方法。
5、请写出生成(2N+1)×(2N+1)大小的高斯一阶导数模板HX(水平方向的
梯度)、HY(垂直方向的梯度)(高斯的方差为sigma)的方法。
6、请写出使用大小为(2N+1)×(2N+1)模板H对图像I进行滤波,生成图像
J的方法。
7、请写出使用大小为3×3的模板对图像I进行中值滤波,生成图像J的方法。clear;
A=imread('num22','bmp');
subplot(1,2,1);
B=rgb2gray(A);
subimage(B);
title('处理前的图');
C=B;
xsize=size(B);
for k=2:(xsize(1)-1)
for j=2:(xsize(2)-1)
t=B(k-1:k+1,j-1:j+1);
C(k,j)=median(t(1:9));
end
end
subplot(1,2,2);
subimage(C);
title('处理后的图');
8、请写出求 Otsu阈值(即最大类间距准则)的计算方法。
试证明采用最大类间距准则计算出的阈值与采用最小类内距准则计算出的阈值相同。
9、设有一幅二值图像(元素取值为0或1),请生成该图像的标记图像。(即第
一个连通区域中的每一个白色像素的值都置为1,第二个连通区域中的每一个白色像素的值都置为2,依此类推。区域编号可不考虑顺序)
clear all;
close all;
clc;
img=imread('');
imgn=img>128;
s=uint8(1-imgn);
%{
s=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0; %这个矩阵是维基百科中的矩阵
1 1 1 1 1 1 1 1 0 0 1 1 1 1 0 0;
0 0 1 1 1 1 0 0 0 1 1 1 1 0 0 0;
0 1 1 1 1 0 0 0 1 1 1 0 0 1 1 0;
1 1 1 0 0 1 1 0 0 0 1 1 1 0 0 0;
0 1 1 0 0 0 0 0 1 1 0 0 0 1 1 0;
0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0;
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
%}
imshow(mat2gray(s));
[m n]=size(s);
tmp=zeros(m,n); %标记图像
label=1;
queue_head=1; %队列头
queue_tail=1; %队列尾
neighbour=[-1 -1;-1 0;-1 1;0 -1;0 1;1 -1;1 0;1 1]; %和当前像素坐标相加得到八个邻域坐标
for i=2:m-1
for j=2:n-1
if s(i,j)==1 && tmp(i,j) ==0
tmp(i,j)=label;
q{queue_tail}=[i j]; %用元组模拟队列,当前坐标入列 queue_tail=queue_tail+1;
while queue_head~=queue_tail
pix=q{queue_head};
for k=1:8 %8邻域搜索
pix1=pix+neighbour(k,:);
if pix1(1)>=2 && pix1(1)<=m-1 && pix1(2) >=2 &&pix1(2)<=n-1
if s(pix1(1),pix1(2)) == 1 && tmp(pix1(1),pix1(2)) ==0 %如果当前像素邻域像素为1并且标记图像的这个邻域像素没有被标记,那么标记
tmp(pix1(1),pix1(2))=label;
q{queue_tail}=[pix1(1) pix1(2)];
queue_tail=queue_tail+1;
end
end
end
queue_head=queue_head+1;
end
clear q; %清空队列,为新的标记做准备
label=label+1;
queue_head=1;
queue_tail=1;
end
end
end
10、设一幅二值图像中,只有一个白色区域,试给出求该区域外围轮廓线的方法
(要求按顺时针的顺序给出各点的坐标,即行/列号)。
轮廓提取的算法很多,本题对于二值图像可以用一个简单的算法进行处理,首先遍历图像中的每一个像素点,查看该点像素值是否为白色像素点;若是再查看该点周围8邻域像素点的灰度值之和为2040;若是,则该点是内部点,输出图像相应位置置为黑色。若不是,则输出该点的坐标信息。
11、设有一幅二值图像,采用 3×3的结构元(每个元素均为1)对其进行腐蚀
操作,试写出得到结果图像的方法。
%A是处理的矩阵 B是结构体,此题为3x3的元素均为1的结构体,用来对A 进行扫描的
%实现的是简单的二值图像的处理灰度图像有待研究
%实现图像的腐蚀已完成未测试~
function ans =mimerode(A,B)
%初始化
[ha,wa] =size(A);
[hb,wb] =size(B);
origin =[0,0];
ans =zeros(ha,wa);
for i = 1:hb
for j = 1:wb
if (B(i,j)== 1)
origin = [i,j];
break;
end
end
end
%对矩阵A进行边扩张以0补充
new_A =zeros(ha+hb*2,wa+wb*2);
for i = 1:ha
for j = 1:wa
new_A(i+hb,j+wb) = A(i,j);
end
end
%对矩阵A进行遍历
for i = 1:ha
for j = 1:wa
if A(i,j) == 0
continue;
end
%把B 的origin 点移到当前处理点
%寻找B 的影响区域块
begin_i = i + hb - origin(1);
begin_j = j + wb - origin(2);
%对矩阵new_A 中和重合的B 中的元素对比
for i1 =begin_i:begin_i+hb-1
for j1 =begin_j:begin_j+wb-1
flag = true;
if (B(i1-begin_i+1,j1-begin_j+1)== 1 & new_A(i1,j1) ==
0)
flag = false
break;
end
end
end
if flag
ans(i,j) = 1;
else
ans(i,j) = 0;
end
end
end
12、写出二维离散傅立叶变换、反变换的计算公式,给出基于频域滤波的基本步
骤。
二维离散傅里叶变换公式:假设以正方形网格采样得到的图像用f(x,y)来
表示,其大小为N 行M 列,则f(x,y)的二维离散傅里叶变换可以表示为:
F (u,v )=∑∑f N -1y=0(x,y )e -j2π(uu u +uu u ), u =0,1,…u ?1, u =0,1,…u ?
M -1x=01
其反变换为:
f (x,y )= 1uu ∑∑F N-1
v=0(u,v )e -j2π(uu u +uu u ), u =0,1,…u ?1, u M-1u=0=0,1,…u ?1
基于频域滤波的基本步骤:
(1) 用(?1)u +u 乘以图像来进行中心变换
(2) 由(1)计算图像的DFT (离散傅里叶变换),即F(u,v)
(3) 用滤波器函数H(u,v)乘以F(u,v)
(4) 计算(3)中结果的反DFT
(5) 得到(4)中结果的实部
(6) 用(?1)u +u 乘以(5)中的结果
13. 请写出C 均值(K-means )聚类分割的基本步骤。
14. 请写出Canny 算子检测边缘的详细步骤。
算法过程
1高斯函数
2221G(x,y)exp ||,,22y m
x m x m y m x y n m n σ++--+-=-=∑∑表示 高斯滤波器窗口大小
2偏导数:使用微分算子求出偏导数
x y 111111G ,G 111122-????=?=?????---????
B arctan
y x B B ==梯度大小
3非极大值抑制:
沿幅角方向检测模值的极大值点,即边缘点,遍历8个方向图像像素,把每个像素偏导值与相邻像素的模值比较,取其MAX 值为边缘点,置像素灰度值为0.
3双阈值检测:
由于单阈值处理时,合适的阈值选择较 困难,常常需要采用反复试验,因此采用双阈值检测算法。
对经过非极大值抑制后的图像作用两个阈值th1,th2,th1=,两个阈值作用后得到两个图像1、2,较大阈值检测出的图像2去除了大部分噪声,但是也损失了有用的边缘信息。
较小阈值检测得到的图像1则保留着较多的边缘信息,以此为基础,补充图像2中的丢失的信息,连接图像边缘。
4链接边缘的具体步骤如下:
? 对图像2进行扫描,当遇到一个非零灰度的像素p(x,y)时,跟踪以p(x,y)
为开始点的轮廓线,直到轮廓线的终点q(x,y)。
? 考察图像1中与图像2中q(x,y)点位置对应的点s(x,y)的8邻近区域。
如果在s(x,y)点的8邻近区域中有非零像素s(x,y)存在,则将其包括到
图像2中,作为r(x,y)点。从r(x,y)开始,重复第一步,直到我们在图
像1和图像2中都无法继续为止。
? 当完成对包含p(x,y)的轮廓线的连结之后,将这条轮廓线标记为已经访
问。回到第一步,寻找下一条轮廓线。重复第一步、第二步、第三步,直
到图像2中找不到新轮廓线为止。
?至此,完成canny算子的边缘检测。
15、试给出一种图像增强方法,使得图像中暗区域中的内容的对比度加大,以便
更好的分辨暗区域中的内容。
16、试简述中值滤波的特性和适用场合。
中值滤波是一种非线性滤波,由于它在实际运算过程中并不需要图像的统计特性,所以比较方便。中值滤波首先是被应用在一维信号处理技术中,后来被二维图像信号处理技术所应用。在一定的条件下,可以克服线性滤波器所带来的图像细节模糊,而且对滤除脉冲干扰及图像扫描噪声最为有效。中值滤波的目的是保护图像边缘的同时去除噪声。
17、试写出孔洞填充的算法。对二值图像中所有被白色区域包围(封闭)的黑色
像素即为孔洞。
18、设有两个白色区域,被一条细小的白线所连接,试设计一种算法,消除两个
区域之间的细线,使两个区域分开。?