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

来源:互联网 发布:淘宝帮忙跑腿 编辑:程序博客网 时间:2024/06/06 05:35

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

我们使用的图片如下:

这里写图片描述
结果如下:
这里写图片描述

下面稍微介绍一下我自己的处理方法:
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    endendB =[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    endendimshow(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;        endendL = logical(L);se = strel('disk',4);   %创造一个平坦的圆盘型结构元素,其半径为2L = 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%}
0 0
原创粉丝点击