说明:不允许直接使用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 - 6oldX = 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));elsea = double(round(oldX));b = double(round(oldY)); %若不是整数四舍五入后把临近值赋过去im2(x,y) = I(a,b);endendendimshow(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:colim2(i,j,:)=uint8(0);endendfor i=1:m %把原图象像素点旋转后变为新图象点for j=1:nxx=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:3im2(xx,yy,k)=im1(i,j,k);endendendtemp1=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))elsekk=j;endendfor j=1:kkif (im2(i,j,:)==uint8(0))im2(i,j,1)=temp1;im2(i,j,2)=temp2;im2(i,j,3)=temp3;elsetemp1=im2(i,j,1);temp2=im2(i,j,2);temp3=im2(i,j,3);endendendimshow(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));endendsubplot(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-1for j=2:n-1if s(i,j)==1 && tmp(i,j) ==0tmp(i,j)=label;q{queue_tail}=[i j]; %用元组模拟队列,当前坐标入列 queue_tail=queue_tail+1;while queue_head~=queue_tailpix=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-1if 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;endendendqueue_head=queue_head+1;endclear q; %清空队列,为新的标记做准备label=label+1;queue_head=1;queue_tail=1;endendend10、设一幅二值图像中,只有一个白色区域,试给出求该区域外围轮廓线的方法(要求按顺时针的顺序给出各点的坐标,即行/列号)。
轮廓提取的算法很多,本题对于二值图像可以用一个简单的算法进行处理,首先遍历图像中的每一个像素点,查看该点像素值是否为白色像素点;若是再查看该点周围8邻域像素点的灰度值之和为2040;若是,则该点是内部点,输出图像相应位置置为黑色。