1、问题描述:
使用Matlab图像边缘检测和直线提取。通过选取感兴趣区域,用户可以选择需要处理的图像部分。随后,对选取的区域进行亮度调整、直方图均衡化和自适应直方图均衡化等预处理操作,以增强图像的细节和对比度。
然后,将预处理后的图像转换为灰度图像,并使用Sobel算子进行边缘检测。最后,利用霍夫变换方法从边缘图像中提取直线信息,并将检测到的直线绘制在原图像上,以帮助用户分析图像中的线条结构。
2、图片素材:
3、Matlab代码:
% 清空命令窗口和工作区变量
clear;
clc;
% 读取图片
src = imread('0.jpg');
% 获取图像的大小信息
[m, n, z] = size(src);
% 显示原图像
figure(1)
imshow(src)
% 选取感兴趣区域
h=imrect;
% 获取选取区域的位置信息
pos=getPosition(h);
% 拷贝选取图片
imCp = imcrop( src, pos );
% 在新的窗口显示选取的图片
figure(2)
imshow(imCp);
% 将 RGB 图像转换成 LAB 颜色空间
shadow_lab = rgb2lab(imCp);
% 对亮度进行调整
max_luminosity = 100;
L = shadow_lab(:,:,1)/max_luminosity;
shadow_imadjust = shadow_lab;
shadow_imadjust(:,:,1) = imadjust(L)*max_luminosity;
shadow_imadjust = lab2rgb(shadow_imadjust);
% 对亮度进行直方图均衡化
shadow_histeq = shadow_lab;
shadow_histeq(:,:,1) = histeq(L)*max_luminosity;
shadow_histeq = lab2rgb(shadow_histeq);
% 对亮度进行自适应直方图均衡化
shadow_adapthisteq = shadow_lab;
shadow_adapthisteq(:,:,1) = adapthisteq(L)*max_luminosity;
shadow_adapthisteq = lab2rgb(shadow_adapthisteq);
% 将选取的图片转换为灰度图像
im=rgb2gray(shadow_adapthisteq);
% im=imadjust(imCp);
imshow(im)
% 对灰度图像进行边缘检测
Ibw=edge(im,'Sobel',0.05);
figure
imshow(Ibw,[])
% 对边缘图像进行霍夫变换,获取直线信息
[H,theta,rho]=hough(Ibw,'ThetaResolution',0.2);
peaks=houghpeaks(H,100);
lines=houghlines(im,theta,rho,peaks);
% 在图片上绘制检测到的直线
figure
imshow(im)
hold on
for k=1:length(lines)
xy=[lines(k).point1;lines(k).point2];
plot(xy(:,1),xy(:,2))
end