clc;
clear all;
k=input('Enter the file name:','s'); % 输入图像
im=imread(k); %读取图像
im=im2double(im); %将图像转化为double型 不是的,看我们的需要,不过大多数都是 因为double类型,处理基本不受限制,其他类型有时受限制
im1=rgb2gray(im); %将图像转换为灰度图像
im1=medfilt2(im1,[3 3]); %中值滤波 这个窗口有3*3的,5*5的,7*7的等等 ,选择哪个都可以,关键看我们图像的要求,当然窗口越小,效果会越好 均值滤波使得图像模糊
BW = edge(im1,'Sobel'); %找到边缘 canny,prewitt,log都试过了,效果没有sobel好
[imx,imy]=size(BW); %提取BW图像的大小 imx代表行数,imy代表列数
msk=[0 0 0 0 0;
0 1 1 1 0;
0 1 1 1 0;
0 1 1 1 0;
0 0 0 0 0;]; %随便删,随便加行,减行都可以 实验了很多种,最后得到这个是最好的。
B=conv2(double(BW),double(msk)); %平滑图像 平滑图像能帮助我们更好的标注 图像实际由于灰度不同,会呈现许多区域 标注就是对每个区域进行标注
L = bwlabel(B,8); %标注连通对象 选择8连通进行标注 用8连通函数进行标注可以为了标注的更紧密些 因为所谓的8连通是指可以向8个方向进行扩展
mx=max(max(L)); %标注的最大数 一共有多少个灰度区域
[r,c] = find(L==17); %找到目标对象 r c 是横纵左边
%以下是将目标对象储存
rc = [r c]; %存目标坐标
[sx sy]=size(rc);
n1=zeros(imx,imy); %定义图像大小
for i=1:sx
x1=rc(i,1);
y1=rc(i,2);
n1(x1,y1)=255; %实现图像的分割
end
%分别显示原图、去噪后的图像、平滑后的图像、实现分割的图像
figure,imshow(im);
figure,imshow(im1);
figure,imshow(BW)
figure,imshow(n1)