判断图像中的三角形,圆形和矩形

这是我自己做作业的时候写的一点东西,判断一张图片中的形状(图片如下,放到其他图片的话可能就不适用了),所以仅供参考,自己水平确实比较低,希望大家不喜勿喷~

我们使用的图片如下:

《判断图像中的三角形,圆形和矩形》
结果如下:
《判断图像中的三角形,圆形和矩形》

下面稍微介绍一下我自己的处理方法:
1.首先是将彩色变灰度。
2.因为图片含有边框,所以首先对边框进行处理,将边框去除。 去除后的图形如图3. 可以看到边上的圆有点变形,不过不影响形状的判断,
只是会影响质心位置的计算。
《判断图像中的三角形,圆形和矩形》
3. 为了计算质心。 先对图形进行边缘提取,然后计算每块区域所有点的位置坐标平均值,即质心坐标
4.计算每块区域边缘点到质心的距离,进行曲线拟合。根据极点的数目判断图形的形状。
5.把区域的形状标在图片中

我的matlab代码


f4=imread('Project2016.jpg');     %读取图像 
imshow(f4)
a=rgb2gray(f4);          %将彩色图像转换成灰度图像
a_size = size(a);
b = ones(a_size);

for i =1:a_size(1)
    for j = 1:a_size(2)
        if a(i,j)>=0 && a(i,j)<=50
            b(i,j)=0;
        end
    end
end



B =[1 1 1 1;1 1 1 1;1 1 1 1;1 1 1 1];  %此模板的选择有待再考虑
b = imerode(b,B);

for i =1:a_size(1)
    for j = 1:a_size(2)
        if  b(i,j)==0
            a(i,j)=255;
        end
    end
end
imshow(a)

bw=edge(a,'prewitt');     %边缘检测   边缘检测结束后发现还是有一些鼓励的小点,不多它们没有形成闭合的曲线
[L,num] = bwlabel(bw);               %这里已经给每个区域标好号了,使用bwlabel的话会把鼓励的不成闭合曲线的点也算进去
%一些独立点的像素数量是比较少的,所以可以通过检测每一块区域的像素点大小来决定是不是要删除此像素块
for i= 1:num
        [r,c]=find(L==i);
        size_L = size([r,c]);
        if size_L(1,1)<30
            L(r,c)=0;
        end
end
L = logical(L);

se = strel('disk',4);   %创造一个平坦的圆盘型结构元素,其半径为2
L = imclose(L,se);    %关闭图像
[L,num1] = bwlabel(L);
L = rot90(L,3);
L = fliplr(L);
pixel = cell([num1,1]);
centre = zeros(num1,2);
size_L = size(L);
for i=1:num1
   
    [r,c]=find(L==i);
    pixel{i} = [r,c]; 
    hold on
    mean_pixel = mean(pixel{i});
    centre(i,:) = mean_pixel;         
    plot(mean_pixel(1,1),mean_pixel(1,2),'r*')
    size_r = size(r);
    distance = zeros(size_r);
    for j = 1:1:size_r(1)
            distance(j) = sqrt((r(j)-mean_pixel(1))^2 + (c(j)-mean_pixel(2))^2);
    end
    p=polyfit((1:size_r(1))',distance,7);
    x = (1:size_r(1))';
    y = p(1)*x.^7 + p(2)*x.^6 + p(3)*x.^5 + p(4)*x.^4 + p(5)*x.^3 + p(6)*x.^2 + p(7)*x.^1 + p(8);
    %plot(x,y)            %对数据进行拟合,因为数据过于杂乱,不好判断    
    min_distance = min(distance);
    max_distance = max(distance);
    min_y        =  min(y);
    max_y        =  max(y);
    num_peaks    =  size(findpeaks(-y));
    if (max_distance - min_distance)<= 15 && (max_y - min_y) <= 15
        text(mean_pixel(1,1),mean_pixel(1,2),sprintf('圆形  %d',i))
    elseif num_peaks(1) == 2
        text(mean_pixel(1,1),mean_pixel(1,2),sprintf('三角形  %d',i))    
    else
        text(mean_pixel(1,1),mean_pixel(1,2),sprintf('矩形  %d',i))
    end    
end

%}

我的博客: www.wangs0622.com

    原文作者:wangs0622
    原文地址: https://blog.csdn.net/wangs0622/article/details/54583245
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞