matlab图像处理常用功能以及函数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在工作学习中,常常会遇到图像处理相关的任务,这些任务可能包括灰度处理、形状识别等,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=kjx+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);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值