📄 s3.m
字号:
%============================================s3.m=============================================
%Step3:对二值图像进行霍夫变换
%Mmax和Nmax分别为离散化的分割数,这里设置为1000
Mmax = 1000;
Nmax = 1000;
H = zeros(Mmax,Nmax); %初始化霍夫数组
L = size(P); %获得二值图像的大小
%霍夫变换,对每个值为1的像素点进行遍历,并累加到霍夫数组中
for i = 3:L(1)-2,
for j = 3:L(2)-2,
if P(i,j) == 1,
for n = 1:Nmax,
th = pi*(n - 1)/(Nmax - 1)/2; %得到n表示的θ值
r = j*cos(th) + i*sin(th); %得到θ对应的ρ值
m = (Mmax - 1)*r/3000 + 1; %得到ρ值对应的离散数
m = round(m);
H(m,n) = H(m,n) + 1; %霍夫数组加一
end
end
end
end
%求出霍夫数组中最大的和第三大的数据
i1=1;
j1=1;
i2=1;
j2=1;
L = size(H);
for i = 1:L(1),
for j = 1:L(2),
if H(i,j)>H(i1,j1),
j3 = j2;
i3 = i2;
i2 = i1;
j2 = j1;
i1 = i;
j1 = j;
end
end
end
L = size(I); %获得原图像的大小
x = 1:L(2)+2; %x的取值范围是1~L(2)+2
%求出两个边缘直线的参数
th1 = pi*(j1 - 1)/(Nmax - 1)/2;
th2 = pi*(j3 - 1)/(Nmax - 1)/2;
r1 = 3000*(i1 -1)/(Mmax - 1);
r2 = 3000*(i3 -1)/(Mmax - 1);
y1 = round((r1 - x*cos(th1))/sin(th1));
y2 = round((r2 - x*cos(th2))/sin(th2));
%为了使直线在图像中比较明显,使用红色,并且厚度取3个像素
for i = 2:L(2)+1,
I(y1(i)-1,i-1,1) = 255;
I(y1(i)-1,i-1,2) = 0;
I(y1(i)-1,i-1,3) = 0;
I(y1(i),i-1,1) = 255;
I(y1(i),i-1,2) = 0;
I(y1(i),i-1,3) = 0;
I(y1(i)+1,i-1,1) = 255;
I(y1(i)+1,i-1,2) = 0;
I(y1(i)+1,i-1,3) = 0;
I(y2(i)-1,i-1,1) = 255;
I(y2(i)-1,i-1,2) = 0;
I(y2(i)-1,i-1,3) = 0;
I(y2(i),i-1,1) = 255;
I(y2(i),i-1,2) = 0;
I(y2(i),i-1,3) = 0;
I(y2(i)+1,i-1,1) = 255;
I(y2(i)+1,i-1,2) = 0;
I(y2(i)+1,i-1,3) = 0;
end
imwrite(I,'pipe_out.jpg','jpg'); %将处理出来的图像输出到pipe_out.jpg中
%=========================================s3.m(end)==========================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -