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);%取得上面获取一维数组的最大值,其所对应的位置即为角度值
%可以结合上一篇的代码在取得图像的倾斜角度后进行矫正