直线角度提取


clear all;
imagDat=imread('t3','bmp');
imagGray=rgb2gray(imagDat);
figure(1);
imshow(imagGray);
 imagMidfilter = medfilt2(imagGray,[3 3]);    % 用指定大小为m×n的窗口对图像A进行中值滤波。
%imagMidfilter=imagGray;

%% 二值化图像

[row column]=size(imagMidfilter);
hist(imagMidfilter(:),0:255);
threshold=100;%二值化的阈值 根据上面的直方图手动设定
for i=1:row
    for j=1:column
        if  imagMidfilter(i,j)>threshold 
               binaryImag(i,j)=255;
        else   binaryImag(i,j)=0;
        end
    end
end
figure(4);
imshow(binaryImag);
title('二值化图像binaryImag');
%% 边缘检测  在提取倾斜角度之前 需要通过边缘检测来去掉多余的点
BW=edge(binaryImag,'canny',0.1);%边缘为 ‘1’
figure
imshow(BW);

 %%   提取角度
m=0;
endAngle=180;%角度的范围为0--180度 
            %注意matlab中进行cos等计算时 需要将角度化为以弧度为单位
for i=1:row
    for j=1:column
        if  BW(i,j)==1  % 逻辑位图中 数值1 为白色  即代表图像边缘
         m=m+1; % m为图像中边缘点的数目
        end
        for a=1:endAngle
            if  BW(i,j)==1
                p(m,a)= fix(i*cos(pi*a/180) + j*sin(pi*a/180));
            end
        end
    end
end
%p(m,a)数据
% p(1,1)     p(1,1)     p(1,1) ...  p(1,1)      1度
% p(2,2)     p(2,2)     p(2,2) ...  p(2,2)      2度
% p(3,3)     p(3,3)     p(3,3) ...  p(3,3)      3度
% ........................................      ...
% p(m,180)   p(m,180)   p(m,180) ...p(m,180)    180度
 
% 下面找出上面矩阵中每一行的数值相同的数的最大值
% 在数组【1 2 3 4 5 2 3 4 22 3 2 2 1】中即为4(即由4个2)
for i=1:endAngle
    table=tabulate(p(:,i));
    [F,I]=max(table(:,2));
    maxx(i)=F;% 获取每一行的数值相同的数的最大值
end
[F,angle]=max(maxx);%取得上面获取一维数组的最大值,其所对应的位置即为角度值

 

%可以结合上一篇的代码在取得图像的倾斜角度后进行矫正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值