如何用Hough变换检测一幅二值图像中的最长直线
2015-06-09 · 知道合伙人数码行家
可以叫我表哥
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:25897
获赞数:1464984
2010年毕业于北京化工大学北方学院计算机科学与技术专业毕业,学士学位,工程电子技术行业4年从业经验。
向TA提问 私信TA
关注
展开全部
楼主可以试一下这段代码,希望能对你有帮助
I = imread('E:\pic\2\编号\4.bmp');%读取图像
rotI = imrotate(I,-4,'crop');%图像旋转33°
subplot(221),
fig1 = imshow(I);%在第一幅子图中绘制旋转后的图像
BW = edge(I,'canny');%使用canny方法检测目标边界
subplot(222),
imshow(BW);%显示边界的二值图像
[H,theta,rho] = hough(BW);%hough变换
subplot(223),
imshow(imadjust(mat2gray(H)),[],'XData',theta,'YData',rho,...
'InitialMagnification','fit');%显示hough变换的变换矩阵
xlabel('\theta (degrees)'), ylabel('\rho');
axis on, axis normal, hold on;
colormap(hot)%颜色映射表
P = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));%hough变换的极值点
x = theta(P(:,2));
y = rho(P(:,1));
plot(x,y,'s','color','black');%画出极值点
lines = houghlines(BW,theta,rho,P,'FillGap',...
5,'MinLength',7);%返回直线的端点%
subplot(224),
imshow(rotI), hold on
max_len = 0;
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');%检测到的直线
plot(xy(1,1),xy(1,2),'x','LineWidth',2,...
'Color','yellow');%起始端点
plot(xy(2,1),xy(2,2),'x','LineWidth',2,...
'Color','red');%终止端点
len = norm(lines(k).point1 - lines(k).point2);%直线的长度
if ( len > max_len)
max_len = len;%确定最长的直线
xy_long = xy;
end
end
plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,...
'Color','cyan');%绘制最长的直线
I = imread('E:\pic\2\编号\4.bmp');%读取图像
rotI = imrotate(I,-4,'crop');%图像旋转33°
subplot(221),
fig1 = imshow(I);%在第一幅子图中绘制旋转后的图像
BW = edge(I,'canny');%使用canny方法检测目标边界
subplot(222),
imshow(BW);%显示边界的二值图像
[H,theta,rho] = hough(BW);%hough变换
subplot(223),
imshow(imadjust(mat2gray(H)),[],'XData',theta,'YData',rho,...
'InitialMagnification','fit');%显示hough变换的变换矩阵
xlabel('\theta (degrees)'), ylabel('\rho');
axis on, axis normal, hold on;
colormap(hot)%颜色映射表
P = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));%hough变换的极值点
x = theta(P(:,2));
y = rho(P(:,1));
plot(x,y,'s','color','black');%画出极值点
lines = houghlines(BW,theta,rho,P,'FillGap',...
5,'MinLength',7);%返回直线的端点%
subplot(224),
imshow(rotI), hold on
max_len = 0;
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');%检测到的直线
plot(xy(1,1),xy(1,2),'x','LineWidth',2,...
'Color','yellow');%起始端点
plot(xy(2,1),xy(2,2),'x','LineWidth',2,...
'Color','red');%终止端点
len = norm(lines(k).point1 - lines(k).point2);%直线的长度
if ( len > max_len)
max_len = len;%确定最长的直线
xy_long = xy;
end
end
plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,...
'Color','cyan');%绘制最长的直线
Sievers分析仪
2024-10-13 广告
2024-10-13 广告
是的。传统上,对于符合要求的内毒素检测,最终用户必须从标准内毒素库存瓶中构建至少一式两份三点标准曲线;必须有重复的阴性控制;每个样品和PPC必须一式两份。有了Sievers Eclipse内毒素检测仪,这些步骤可以通过使用预嵌入的内毒素标准...
点击进入详情页
本回答由Sievers分析仪提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询