“0-4房屋图像1.jpg”和“0-5房屋图像2.jpg”是房屋立面的图像。请利用Hough变换检测,计算获得矢量化的房屋边缘特征。
首先先将彩色图片进行灰度处理,然后通过边缘检测算子,如Roberts算子,Prewitt算子,LoG算子……对目标图像边缘进行检测。
其次,用均值滤波或者中值滤波对边缘检测后的图像进行去噪处理,去掉图像上的一些影响图像边缘提取的噪点。(这里有个小问题,最好先对原图像进行滤波处理再将处理过的图像进行边缘检测,因为没时间了就不做修改了,还有算子的话最好自己再加个canny算子提取效果会更好)
接着,将图像进行二值化处理,转化为黑白图片
最后,通过Hough变换检测,将边缘描绘出来得出最终的提取效果。
使用matlab app进行图形界面化设计,要求能够从文件夹中读取文件并在界面上展示,设计多种边缘检测算子与滤波处理和二值化处理,能够在界面上显示处理效果。并能将最后的效果保存到指定的文件夹中。
打开文件夹,将内容显示在UIAxes的框框内
function ButtonPushed(app, event)
[filename,filepath]=uigetfile({'*.jpg','*.png'},'选择图片');
if isequal(filename,0)||isequal(filepath,0)
errordlg('没有选中的文件','错误');
else
file=strcat(filepath,filename);
end
im=imread(file);
app.originimg = im;
app.gim=rgb2gray(im);
app.gim = im2double(app.gim);
imshow(im,'Parent',app.UIAxes);
end
①LoG算子
function log = log_margin(app,img)
[m,n]=size(img);
log=zeros(m,n);
for i=3:m-2
for j=3:n-2
log(i,j) = -img(i-2,j)-img(i-1,j-1)-2*img(i-1,j)-img(i-1,j+1)-img(i,j+2)-2*img(i,j-1)+16*img(i,j)-2*img(i,j+1)-img(i,j+2)-img(i+1,j-1)-2*img(i+1,j)-img(i+1,j+1)-img(i+2,j);
end
end
end
②Prewitt算子
function pre = prewitt_margin(app,f)
[m,n]=size(f);
pre=zeros(m,n);
for i=2:m-1
for j=2:n-1
pre(i,j)=abs(f(i-1,j-1)+f(i,j-1)+f(i+1,j-1)-f(i-1,j+1)-f(i,j+1)-f(i+1,j+1))+abs(f(i+1,j-1)+f(i+1,j)+f(i+1,j+1)-f(i-1,j-1)-f(i-1,j)-f(i-1,j+1));
end
end
end
③Sobel算子
function sob = sobel_margin(app,image)
[m,n]=size(image);
sob=zeros(m,n);
for i=2:m-1
for j=2:n-1
sob(i,j)=abs(image(i-1,j-1)+2*image(i,j-1)+image(i+1,j-1)-image(i-1,j+1)-2*image(i,j+1)-image(i+1,j+1))+abs(image(i+1,j-1)+2*image(i+1,j)+image(i+1,j+1)-image(i-1,j-1)-2*image(i-1,j)-image(i-1,j+1));
end
end
end
④Roberts算子
function rob = roberts_margin(app,image)
[m,n]=size(image);
rob=zeros(m,n);
for i=2:m-1
for j=2:n-1
rob(i,j)=abs(image(i+1,j+1)-image(i,j))+abs(image(i,j+1)-image(i+1,j));
end
end
end
①均值滤波
function [smooth] = average_filter(app,image)
[m,n]=size(image);
smooth=zeros(m,n);
for i=2:m-1
for j=2:n-1
smooth(i,j) = image(i-1,j-1)+image(i-1,j)+image(i-1,j+1)+image(i,j-1)+image(i,j)+image(i,j+1)+image(i+1,j-1)+image(i+1,j)+image(i+1,j+1);
smooth(i,j) = smooth(i,j)/9;
end
end
end
②中值滤波
function [ x2 ] = median_filter(app,image, m )
n = m;
[ height, width ] = size(image);
x1 = double(image);
x2 = x1;
for i = 1: height-n+1
for j = 1:width-n+1
mb = x1( i:(i+n-1), j:(j+n-1) );
mb = mb(:);
mm = median(mb);
x2( i+(n-1)/2, j+(n-1)/2 ) = mm;
end
end
end
function [binary_img] = binary(app,image,T)
binary_img = im2uint8(image);% 将均值滤波后的图像转换为uint8类型图像,即图像色彩范围[0,255]
[m,n]=size(binary_img);
for i=1:m
for j=1:n
if binary_img(i,j)>T % 设置二值化的阈值
binary_img(i,j) = 255;% 超过阈值的设为白点
else
binary_img(i,j) = 0;%小于阈值的设为黑点
end
end
end
end
function [origin_img] = hough_tram(app,binary_img,origin_img,T)
angle = 180;
[m,n]=size(binary_img);
distance = round(sqrt(m^2+n^2));
number_ap = zeros(angle,2*distance);
coordinate = cell(angle,2*distance);
for i = 1:m
for j = 1:n
if(binary_img(i,j) == 255)
for k = 1:angle
p = round(i*cos(pi*k/180)+j*sin(pi*k/180));
if(p > 0)
number_ap(k,distance+p) = number_ap(k,distance+p)+1;
coordinate{k,distance+p} = [coordinate{k,distance+p},[i,j]];
else
ap = abs(p)+1;
number_ap(k,ap) = number_ap(k,ap)+1;
coordinate{k,ap} = [coordinate{k,ap},[i,j]];
end
end
end
end
end
for i = 1:angle
for j = 1:distance*2
if(number_ap(i,j)>T)%提取直线的阈值
point = coordinate{i,j};%提取对应点坐标
[m,n] = size(point);
for k = 1:number_ap(i,j)
origin_img(point(2*k-1),point(2*k),1) = 0;
origin_img(point(2*k-1),point(2*k),2) = 255;
origin_img(point(2*k-1),point(2*k),3) = 0;
end
end
end
end
end
function reserve(app,image,sz)
path = 'F:/matlab/work/hough transform/';
prefix = 'hough_';
format = 'jpg';
suffix = strcat('.',format);
imwrite(image,strcat(path,prefix,num2str(sz),suffix));
msgbox('图像保存成功');
end
原图:(边缘不平整)
处理图:
原图:(边缘平整)
处理图:
图像的Hough变换是一种图像特征提取的技术,通过投票法检测特定形状并提取,其方法是在参数空间中通过投票累加获得局部最大值,从而通过值得到符合特定形状的集合,该集合即为Hough变换结果。
在Hough变换中,主要是利用图像的特殊形状,按照指定的函数进行参数空间点的累加,每取到函数形状上的点则进行投票累加,最后通过参数限制获得需要统计的点并组成点的集合,此时即可得到最终的边界点。Hough变换多用于对直线、圆、椭圆形状的检测和提取。Hough变换算法适用于所有能够用方程表达出的图像特征,而其算法的复杂度也随着图像特征方程的复杂度变化。
根据检测结果可以总结出以下几点。
(一)Hough变换是通过函数拟合来完成边缘选择的,对于具有单一颜色、简单边缘以及已知函数的图像而言,Hough变换能够更好地选择边缘,例如上图的小车;
(二)Hough变换不适合用于复杂颜色、复杂边缘的图像,例如上图的房屋,这种图像都不适合进行函数拟合,Hough变换会使得最终的效果较差。
参考文献:
【1】CSDN博客 无限遐想计划 https://blog.csdn.net/qq_43571150/article/details/103544472
【2】数字图像处理(MATLAB版))第二版 冈萨雷斯