数字图像处理——月亮图像的识别与裁剪

已知一张带有月亮的图片(左),截取只有月亮的区域(右),效果如图:
数字图像处理——月亮图像的识别与裁剪_第1张图片
预备知识:
find函数作用:
如图运行结果所示,a是一个二维矩阵,find函数作用是找到矩阵中所有不为零的点的坐标。坐标编号是从最左边一列开始,从上到下依次为1,2,3。。。换列时数字继续累加。
数字图像处理——月亮图像的识别与裁剪_第2张图片
方法一:find法


img=imread('moon.png');%读取moon图像
W=im2bw(img);%把moon图像转化为二值图
[r,c]=find(W);%用find函数找到二值图中从上到下,从左至右所有像素点中值不为零的坐标
figure;%绘制一个窗口
subplot(121),imshow(img);%显示moon图像的原图
subplot(122),imshow(img(min(r):max(r),min(c):max(c),:));%从上到下,从左至右从前到后显示截取后的图像

方法二:投影法,利用sum函数


img=imread('moon.png');
W=im2bw(img);
c=find(sum(W));把二值图中的每个列相加,得到一个一维的矩阵,即得到一个原图中从上到下的一个投影。再用find函数找到这个一维数组中所有值不为0的值的坐标
r=find(sum(W'));通过图像矩阵的转秩,即得到原图中每行像素点值的和,再用find函数找到一维数组中所有值不为零的点的坐标
figure;
subplot(121),imshow(img);
subplot(122),imshow(img(min(r):max(r),min(c):max(c),:));%从上到下,从左至右从前到后显示截取后的图像

方法三:遍历法

img=imread('moon.png');
W=im2bw(img);
c=sum(W);
r=sum(W');
i1=1;
i2=1;
i3=1;
i4=1;
%while遍历相当于手动find,i1表示从上到下中最高位置的像素值不为零的坐标,i2表示最低的像素值不为零的坐标。I3和i4分别表示左右的坐标
while(c(i1)==0)
    i1=i1+1;
end;
i2=i1;
while(c(i2)~=0)
    i2=i2+1;
end;
i2=i2-1;
while(r(i3)==0)
    i3=i3+1;
end;
i4=i3;
while(r(i4)~=0)
    i4=i4+1;
end;
i4=i4-1;
subplot(121),imshow(img);
subplot(122),imshow(img(min(i3):max(i4),min(i1):max(i2),:));

你可能感兴趣的:(数字图像处理)