本博客主要记录我利用Matlab学习图像处理的一些学习笔记,欢迎交流,批评指正。
本篇是第一篇,主要讲解图像处理的一些基础知识,列出如下:
1.二值化
2.开操作
3.连通区域提取
4.连通区域重心提取
5.bouding box提取
各操作背后的理论基础,这里先做简要说明:
1.二值化:通过选取适当的阈值,将图像上的像素点的灰度值设置为0或255【黑(0)和白(255)】,使整个图像呈现出黑白的效果。
图像处理,第一步一般就是进行二值化,而二值化常用的方法有两种(1)ostu方法,(2)Kittle算法。
一般先将图像灰度化,再将灰度图像二值化,然后进行其他处理。matlab可以直接用graythresh方法找到合适的阈值。之后用im2bw将灰度图像转化为二值化图像。
2.开操作:开操作一般应用在二值图像分析处理的基础上,使对象的轮廓变得光滑,断开狭窄的间断和消除细的突出物。
主要用来保留某种结构操作,remove其他不符合结构区域的前景区域像素。此操作依赖于结构元素的选取。
3.连通区域提取:在我们讨论连通区首先要明确域算法之前,首先要知道什么是连通区域。在图像中,最小的单位是像素,每个像素周围有8个邻接像素。
常见的邻接关系有两种:4邻接和8邻接,4邻接的一共有4个点,即上下左右,如下左图所示,8邻接的一共有8个点,包括了对角线,如下右图所示。
如果像素A与B邻接,那么我们称A与B连通,那么有如下结论:
如果A与B连通,B与C连通,那么A与C连通。
从视觉上来看,彼此连通的点形成了一个区域,而不连通的点形成了不同的区域,这样一个所有彼此连通的点构成的集合,我们称为一个连通区域。
4.连通区域重心提取:只需要用matlab的regionprops方法就可很方便的获取各种属性。
5.bouding box提取:同样用regionprops方法获取。
源代码如下:
%function:
%获取图像感兴趣的位置,并进行标记
%date:2016-9-21
%author:Zyy
%清空变量,读取图像,并显示其属性
clear;close all
src = imread('rice.png');
whos
%显示原始图像
figure('name','myapp'),
subplot(2,2,1),imshow(src),title('src')
%用ostu方法获取二值化阈值,进行二值化并进行显示
level=graythresh(src);
bw=im2bw(src,level);
subplot(2,2,2),imshow(bw),title('bw')
%运用开操作消去噪点
se = strel('disk',2);%结构元素se
openbw=imopen(bw,se);
subplot(2,2,3),imshow(openbw),title('open')
%获取连通区域,并进行显示
L = bwlabel(openbw,4);
RGB = label2rgb(L);
subplot(2,2,4),imshow(RGB),title('rgb')
%获取区域的'basic'属性, 'Area', 'Centroid', and 'BoundingBox'
stats = regionprops(openbw, 'basic');
centroids = cat(1, stats.Centroid);
figure('name','regionprops'),
%绘制开操作之后的二值化图像
imshow(openbw),title('centroids')
hold on
%绘制重心
plot(centroids(:,1), centroids(:,2), 'b*'),
%绘制感兴趣区域ROI
for i=1:size(stats)
rectangle('Position',[stats(i).BoundingBox],'LineWidth',2,'LineStyle','--','EdgeColor','r'),
end
hold off