提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
在工作学习中,常常会遇到图像处理相关的任务,这些任务可能包括灰度处理、形状识别等,MATLAB相比于OpenCV等图像处理库更容易操作,然而很多函数用的时候半天想不起来,此处是在忙完项目后偷闲对任务中用到的一些方法进行记录,方便以后查找使用。
一、matlab灰度处理相关
图像整体灰度对比度太小,可以采用灰度拉伸、均衡化的方法
% 将low_in high_in的灰度范围映射到ow_out high_out范围
J=imadjust( I,[low_in high_in],[low_out high_out])
% 使用log曲线拉伸灰度
I = im2double(I);
J = c * log(1 + double(I)); %c为参数
图像二值化,将目标物有效提取
% matlab有一种自适应的寻找阈值分割的方法
I = imbinarize(I,'adaptive','Sensitivity',0.75);
二、形态学的一些函数
1.腐蚀
作用:将二值图目标形状周围减少一圈
se = offsetstrel('ball',5,5); %定义腐蚀的卷积核形状
erodedI = imerode(BW,se); %腐蚀操作
2.膨胀
作用:将二值图目标形状周围加粗一圈
se = strel('line',11,90); %定义膨胀的卷积核形状
BW2 = imdilate(BW,se); %膨胀
3.开运算
开运算效果等同于使用同一个卷积核,先腐蚀后膨胀
作用:使边界平滑,消除细小的尖刺,断开窄小的连接,保持面积大小不变。
se = strel('disk',5);
afterOpening = imopen(original,se);
4.闭运算
开运算效果等同于使用同一个卷积核,先膨胀后腐蚀
作用:可以融合窄的缺口和细长的弯口,合上小洞,填补轮廓上的缝隙
se = strel(‘disk’,10);
closeBW = imclose(originalBW,se);
三、其他一些可能会用到的方法
1.使用hough进行直线检测
大致原理:以直角坐标系为例说明,直线方程为y=kx+b
,对于检测点来说,如果构建一个参数空间,则每一个点都代表参数空间中的一条直线:b=-kx+y
。如果构建一个二维矩阵表,横坐标为k,纵坐标为b,如果有两个点在一条直线上,反映在参数坐标系中则为这两个点代表的直线相交于一点,则二维矩阵表中就在
(
k
i
,
b
i
)
(k_i,b_i)
(ki,bi)的位置统计数+1。当某位置数量特别多时,则说明图像空间中一定有一条
y
=
k
j
∗
x
+
b
j
y=k_j*x+b_j
y=kj∗x+bj直线。由于直角坐标系中k可能为无限大——即k不存在的情况,这个二维矩阵表不容易设置范围,实际应用中更多的是使用极坐标表示,此时参数为
ρ
\rho
ρ和
θ
\theta
θ
RGB = imread('gantrycrane.png');
I = rgb2gray(RGB);
BW = edge(I,'canny'); %边缘检测,二值图像
[H,T,R] = hough(BW,'RhoResolution',0.5,'Theta',-90:0.5:89);
%参数:
% BW:表示输入边缘检测的二值图像
% 'RhoResolution':设置rho间隔的范围
% 'Theta':设置'Theta'的范围及间隔
%输出:
% H:表示二维矩阵表
% T:'Theta'列表
% R:Rho列表
P = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));
%参数:
% H:二维矩阵表
% 5:表示要找5条直线
% 'threshold':设置找直线的阈值(即二维矩阵表中数量较小的位置不认为其为直线)
lines = houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);
%参数:
% BW:表示输入边缘检测的二值图像
% T:'Theta'列表
% R:Rho列表
% 'FillGap':两条直线如果间隔小于5则认为是一条直线
% ,'MinLength':如果直线距离小于7,过滤
figure, imshow(I), 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');
end
end
2.圆检测
使用imcirclefind函数检测圆形
%更详细的参数介绍,请help imfindcircles
[centersBright, radiiBright] = imfindcircles(A,[Rmin Rmax],'ObjectPolarity','bright');
3.闭合形状检测
stats = regionprops('table',BW,'Centroid','MajorAxisLength','MinorAxisLength');
centers = stats.Centroid;
figure,imshow(I);
hold on;
for k=1:length(centers)
plot(centers(k,1),centers(k,2),'x','LineWidth',2,'Color','red'); % 画出图像中心
end
4.寻找峰值
[pks,locs,widths,proms] = findpeaks(y,x,'MinPeakProminence',0.1,'Annotate','extents');
%参数:
% y:纵坐标值列表
% x:横坐标值列表(注意x对应y,且x需要从小到大排序)
%输出
% pks:峰值
% locs:峰值所在的位置
% widths:半高宽
5.手动选择区域
h1 = figure();imshow(BW);
[S,~,~]=roipoly;
S1 = S; %注意窗口的坐标系和图像坐标系原点位置不同,可能需要使用S1 = S'变换到同一坐标系
for i=1:size(BW,1)
for j=1:size(BW,2)
if S1(i,j)==false
BW(i,j)=0;
end
end
end
close(h1);