I=imread('E:\QQ截图(百度知道)\8c1001e9ba102363b80e2d09.jpg');
I1=rgb2gray(I);
I2=im2bw(I1);%%转化成二值图像
%figure,imshow(I2);
se=strel('square',3);
I2_1=imopen(I2,se);%%用开运算去掉凯隐乱很小的毛刺
se1=strel('disk',11);
I2_2=imclose(I2_1,se1);%%闭运算进行小区域填充
Image=zeros(size(I1));
[m,n]=size(I1);
for i=1:m
for 携晌j=1:n
if I2_2(i,j)==1
Image(i,j)=I1(i,j);%%根据最后的二值图像对原图像进行筛选,保留四个圆区域,其盯档余部分去掉
end
end
end
figure,imshow(uint8(Image))
%%%%%%%%%%%%%%%%%%%%
这样后,可以直接对Image进行中值滤波,即可达到对四个圆区域的中值滤波。
要对区域进行标记的话,参考regionprops函数中的'ConvexHull'属性,最小外接凸多边形。
很简单的, 因为你的图中的圆不是标准的规范的圆, 用圆的方程之类的方法话边框反而不好, 直接遍历图像中所有像素, 如果相邻像素的像素值相差超过了一定的阈值(自己试一下, 我感觉至少有50以上), 就把这个点标记成红色. 以后处理的时候判断一下当前经过的红色点的个数, 偶数个肯定是圆框外的部分, 奇数个就在圆框内的部悄圆分.
比如说我现在遍历到了图像的第二行, 一开始我没有告运碧遇到红色点, 红色像素点个数累积为0. 这时就不用做图像处理, 等到遇到袜举了第一个红色像素, 这时我们就进入了图中第一个圆的区域中, 然后开始做处理, 下次遇到红色点就表示离开了圆形区域. 后面的同样道理
把1楼的程序用2次,就实现了2次子区域滤波。
a=imread('待分割滤波处乎燃迅理图片.图片格式'岁此);
gaussianFilter=fspecial('gaussian',[7,7],5); %设置滤波器
%读出a中待滤波区域1: 10:100,20:120分别为y,x的区间,
b=a(10:100,20:120);
c=imfilter(b,gaussianFilter,'symmetric','conv')%滤波
a(10:100,20:120)=c; %读回
%读出a中待滤波区域2:10:100,120:220分别为y,x的区间,段羡
b=a(10:100,120:220);
c=imfilter(b,gaussianFilter,'symmetric','conv'); %滤波
a(10:100,120:220)=c; %读回
%二值化,假设阈值为150
d=find(I<150);
I(d)=0;
d=find(I>=150);
I(d)=255;
可以直接处理呀,竖茄不用管周围悉颤,因为黑色都是灰度为零的啊,对整幅图像中值滤波,在用edge函数取边,对边缘的红色分量增加到睁纤败最大,其余绿色和蓝色分量将为零(灰度图像不用分),在画出整幅图就ok啦,以后处理的时候也不会对其他位置的像素值有太大影响。