对一个图像的像素来说,之所以能够分割是因为图像像素之间有相似的地方-同类,也同时像素和像素之间也有不连续的情况-边界问题,所以可以对图像进行分割。
图像分割,图像的表示和描述是图像处理的中间阶段,前面讲的图像的滤波,增强属于图像处理的初级阶段,
分割是找出你需要识别最有意义的部分的区域,对这些区域进行描述,描述方法有:
描述它的纹理特征,直方图特性,曲线的形状,面积,长宽比。
提取出某些目标区域图像的特征:
这些特征是根据不同的图像,不一样的特征。比如指纹识别,有提取分叉的拐点交点的个数,
要提取这些特征,就必须做前期处理:1,去掉背景,去掉不用的信息,找出关键信息。所以前期的图像分析主要是在预处理和图像的分割上面。分割准确了才能把你所要的目标提取出来,进行后续的特征提取。
这里介绍4种图像分割方法
1,直方图门限选择
2,半阈值选择图像分割
3,迭代阈值图像分割
取一个阈值,大于阈值置白,小于阈值置黑。
分割是要进行二值化,去背景找前景。
比如下图:
要提取细胞,先将其二值化,大于阈值置白,小于阈值置黑,细胞是我们要的目标。背景比较白,属于1的。像素大于T的属于背景,小于T的属于目标.
可以看到,这幅图的直方图,分为2部分,两个波,两个波的波底-谷底处选了一个阈值,亮的属于背景,黑的属于目标。
两个物体一定有不同的灰度,如果灰度相同就没办法分割,所以它有不同灰度,在直方图上反映的情况是不同的,所以在分割时首先要用直方图。
选择一个阈值后进行分割,把背景置白,只剩下物体。
案例:要统计图中细胞有多少个,要用机器数,先把它分割出来,首先要去背景,然后去噪声。用平滑去噪方法把这些小噪声去掉,然后进一步把物体提取出来。
可以用直方图,阈值T使用直方图。一个图像中至少2个物体,前景和背景,如果前景和背景的灰度不同,那么它的分布范围就不同,所以在两个物体之间一定会有一个波谷,波谷所对应的灰度集作为阈值。那么这里面它的前提假设条件是只有物体和背景2个部分,那么这个直方图显示的是双峰的特点。
这个直方图显示的是双峰的特点,只有两部分,两部分一画出来就找个波-谷底,如何找谷底??
1,人工选择,人工阈值,2,
自动算出阈值的过程。
分割时注意,要分区间,在一个小区间里面,不同物体用它很好,对于一个大的图像来说,用它效果不好。
基本思想:选择一个阈值作初值。
选择图像灰度的中值:
中值是先把整幅图求出平均灰度,把所有像素相加求出总数,再求平均。
然后用阈值把图像分割成两部分,大于阈值的一部分和小于阈值的一部分。
新的阈值等于分割好的两个区域的像素均值的平均值。2个均值的均值。
得到新的阈值后再根据这个新的阈值分割图像
终止条件:上次算出的阈值和新的阈值相同或基本无变化。
例1imhist获取灰度图像的直方图
%imhist获取灰度图像的直方图
clear all;
close all;
clc;
I=imread('细胞24.jpg');
figure;
subplot(121),imshow(I);
subplot(122),imhist(I,250);
例2用全阈值对图像做分割
%用全阈值对图像做分割
clear all;
close all;
clc;
I=imread('细胞.bmp');
I=rgb2gray(I);%将彩色图转化为灰度图
J=I>120; % 人工找的,图像分割,阈值为120.大于120的为1,小于120为0
% 灰度图像--图像数组可以直接作比较操作,和数组操作一样
%这个简单的操作和下面的for循环效果等同
[width,heigh]=size(I);%图像的宽和高(行和列)
for i=1:width
for j=1:heigh
if(I(i,j)>130)%图像分割,阈值为130,大于130为1,小于130为0
K(i,j)=1;
else
K(i,j)=0;
end
end
end
figure;
subplot(131),imshow(J);%一个阈值为120
subplot(132),imshow(K);%一个阈值为130
subplot(133),imshow(I);
%阈值越大,黑的多
例3用函数im2bw做彩色图像分割
%用函数im2bw做彩色图像分割
clear all;
close all;
clc;
%带索引表的图。图像数据放到x,颜色索引值放到map
[X,map]=imread('细胞256.bmp');
J=ind2gray(X,map); %索引图转换为灰度图
%二值化只能对灰度图做,彩色图不能做
K=im2bw(X,map,0.4);%图像分割,阈值为0.4
%做二值化一定要转移到灰度图像
figure;
subplot(121),imshow(X);
subplot(122),imshow(K);
例4用Otsu算法做图像分割
%用Otsu算法做图像分割
clear all;
close all;
clc;
I=imread('细胞.bmp');
J=im2double(I);
T=graythresh(J); %获取阈值,该函数采用Otsu算法获取图像I最优阈值
H=im2bw(J,T); %图像分割,用阈值作二值化
figure;
subplot(121),imshow(J);
subplot(122),imshow(H);
例5用迭代阈值法对图像进行分割
%采用迭代阈值法对图像进行分割
clear all;
close all;
clc;
I=imread('细胞.bmp');
J=im2double(I);
T0=0.01; %给定初始阈值
T1=(min(J(:))+max(J(:)))/2; %读取图像中最大像素和最小像素的均值作为初始阈值
r1=find(J>T1);
r2=find(J<=T1);
%find(),如果X为多维数组,则find返回由结果的线性索引组成的列向量.按列计数,返回索引
T2=(mean(J(r1))+mean(J(r2)))/2; %新的阈值
while abs(T1-T2)<T0 %迭代求阈值
T1=T2;
r1=find(J>T1);
r2=find(J<=T1);
T2=(mean(J(r1))+mean(J(r2)))/2;
end
H=im2bw(J,T2);%图像分割,就是用阈值作图像二值化.
%thresholding,阈值.Convert image to binary image by thresholding.
%H=imbinarize(J,T2);
figure;
subplot(121),imshow(J);
subplot(122),imshow(H);
先二值化,然后把背景去掉,用迭代阈值法或直方图的人工参与法,尽可能去掉背景。
即先用图像阈值分割将图像的背景和目标物体分割,去掉背景。然后提取目标物体的轮廓。
本节课介绍4种方法:
1,轮廓提取法
2,边界跟踪法
3,区域增长法
4,区域分裂合并法
原理
应用于二值图像
要求图是二值化图,如果不是二值化图,我们自己将其二值化。
判别准则:物体的边界是相同颜色,或者跟它邻域
搜索准则:
确定搜索的终止条件:
方向的角度偏移量都是固定的,位置固定。
图像二值化处理就是用图像阈值分割将图像的目标物体和背景分割,去掉背景。
区域分割利用空间关系,利用这个像素,看一个点和四周一样吗,不断扩大范围。
区域增长法就是属于同一区域的像素应该具有相似性,就是这个像素和周围的像素非常相似,有个阈值,相似到什么地步?比如他俩之差为2,那就是一个物体。
空间和实践开销大:因为每个点都在算
种子点:在做图像时,人为指定一个像素值,种子就是这个点的灰度值是多少。
鼠标一点,灰度值就取到了。之后,这个像素的灰度值和种子点的灰度值是否一致。
判断是否一致:相减。相减结果之差0就是一致,差距很大就是不一致。是都小于标准差。
标准差是自己指定的,指定为2...,
是则将该店和种子点合并,两个点属于同一个区域。不是则保持像素的灰度值不变。
像素的相似性度量:平均灰度值,纹理,颜色等信息。...
区域增长法主要确定3个:如下图
选择合适的种子点:人为指定
举例如下:像素偏差不能超过2
又分裂又合并的过程
一幅图知道它不是同一个物体,首先进行分裂,分裂成4个区域以后,再进行判断是不是同一个物体,不是再分裂。
一致性准则:就是说这个区域里面的灰度值/纹理/颜色一样,那么就不用分裂了,不满足就要分裂。
如何分裂?用四叉树数据结构一次性分为四份。
如下图:
初始分区,上来就分成4个区域。
对每个区域计算它是不是一致的,P(Ri)。不满足一致性,整个区域中不是同一个物质构成的,
分完之后还要合并,
区域分裂合并整合起来
在二值图像中有很多物体,如果是我们的目标物体,要进行特征提取,提取哪些特征?
可以提取颜色特征,直方图特征,纹理特征,
这节课主要讲面积特征和周长特征。
对图像上有几个物体要数数,进行标记。
要想标记图像,首先进行二值化,二值化之后对图像开始标记。注意这是对每个区域进行标记。
标记操作之后,我们才能知道这个图有几个物体。
标记之后。
比如有3个物体,每个物体不取它的颜色值,而是取它的标号值。
比如说第一个物体,每个像素放的不是颜色值,而是它的标号值。比如物体1,像素值为111。
我们统计物体1这幅图中1有多少个,就得出物体1的面积。
所以在新开辟的内存空间,每个像素存的是它的标号,而不是灰度值。
举例如下图:
一个目标区域检测方法:
图上有3个物体,A,B,C.到底哪些像素属于第一个物体/第二个/第三个,一幅图中3个物体怎么找?
像素中存放的颜色值变为标号值,比如所有A都是1,所有B都是2,所有C都是3,存的是标号。
然后我数数有几个1,就得到它的面积,所谓的面积就是像素的个数。沿着物体的边沿的跟踪法,将边缘提取出来,外轮廓提取出来,统计外轮廓有多少个1,那就是算出它的周长。
对于这幅图,就是要先做标号/标记。做标记的规则;
对于上面这幅图,就是要先做标号/标记。做标记的规则-如下图:
每个像素要扫描,看看每个像素是否为背景。二值化之后的图像。背景是白,目标是黑,或者反之。假设背景为白,目标物体为黑,我们看从上到下,是不是白颜色,都是白颜色那么都是背景。找到一个黑的时候那就是找到一个目标点了。
对这个目标点,看它的左上,正上,右上,左前点都不为物体,那么这块就给它标号,加1。
后面的步骤如下图:
之后再逐个像素扫描后面,后面的为背景,然后继续扫描,扫描到一个和背景不同的像素,但是跟之前的标记为1的像素不连接,那么新的像素标记加1,即标记为2.
有时候就要特别调整一下:
周长就是外轮廓所含像素个数
如果有的物体用中值滤波或噪声消除法,这些方法只能消除很小的、孤立的像素,雪花类的像素。如果有的物体也是噪声,但是面积比孤立值大的时候,用前面哪些方法就去不掉。
那么我们统计完面积之后,把小于某一些面积的这些物体去掉,所以就是小区域消除法。
如下图:
首先是水平投影:经过投影,车牌照所出现的位置在这个数据区里面就定位了,可知道车牌照在第几行上出现的。
然后是垂直投影:在识别汽车牌照时我要把字符进行分割,一个字符一个字符去识别。分割就必须找到这个字符的外切的矩形,那么经过垂直投影的话,这个有白像素的就给间隔开了,就把物体的间隔找到了。
所以根据这个垂直投影的间隔找到有黑像素的,到了一个地方又出现了白的,然后又找到了黑像素。那么就把这个w的外切的矩形的宽度找到了。
所以投影能起到定位的作用
整个图像处理需要做分析,切割,所以分割离不开投影的作用。
比如做人脸识别,先投影,投影黑的白的以后能找到眉毛,眼睛...找到他们的位置,然后做下长宽的比例,就得到了人的特征。
对于汽车牌照,我们看到经过灰度化之后,区域的二值化,去除噪声之后,我们就统计这一行0变1,1变0的个数,个数比较多的行就给它画出来,这相当于也是一个投影,0-1的投影,
那么就把汽车牌照这一行给定位过来了,定位之后再进行投影,垂直方向上的投影
纹理涉及到大量计算性的问题。
在对纹理计算之前,再考虑一下纹理的特点:图像的灰度级或颜色的变化。
灰度变化从高到低,从低又变高,是有规律的,因为这个小像素元和那个小像素元是一样的,反复出现的纹理基元。所以纹理肯定不是一个大的整幅图。一个大的整幅图就一个纹理,不能和其他比较。纹理肯定是把一幅图分成若干个小区域,所以每个小区域应该是很基本的一个区域。
纹理在比较时候不是一幅图,一定要有两副图来进行比较。
纹理是个基元,而不是个像素。如果一个像素和两个像素点之间直接算相同和不同就行了,它也不是一个整图,它一定要把它分割成若干个小区域,那么它的这个排列是有一定规则性的。这是和空间统计相关的。
构成纹理特征的两个要素:
1,纹理基元,由一定形状和大小多种图像基元的组合叫纹理基元。也就是说纹理基元是有形状有大小的,不是孤立的一个像素。
2,一个纹理可能是若干个纹理基元组合而成。一个纹理可能是某一个基元的纹理,也可能是多个基元的纹理。
我们原来习惯于一个像素一个像素的研究,取它的边界,求它的灰度值,把它二值化,现在完全是通过纹理基元来操作的。
统计方法:
空间域统计方法:
如利用直方图的统计:
这一个小区域求出直方图,对应的另一个小区域求出直方图,看他俩是否相同。
或把它求完梯度之后,对于梯度图再求直方图进行分析,所以它有这个空间域,因为它每个位置是一一对应的,
频域:
空间域统计方法
1,选择合适的邻域大小
因为纹理基元是有一定形状,一定大小的小区域,所以要选择合适的邻域范围
2,计算直方图
3,比较2个直方图的相似性
在做人脸分析时,对人脸分区,之后求直方图,然后和库里的直方图的特征要一一对应上的。
4,若相似,说明存在已知的纹理基元
衡量直方图间的相似性
如何求两个直方图的相似?
直方图是一个数组
下图中,直方图用h指代。
直方图的下标,最小下标是0,最大下标是255.
看两个直方图是否相同:求均值,方差,均值和方差都相同,说明两个直方图相同,纹理是一样的。
如何求均值:直方图-灰度值*个数=亮度,图像的灰度总和/像素个数=均值。
方差:(每个像素值-均值)**2/像素个数=方差。
将当前像素的累计直方图求出来了
然后在累计直方图中,第一幅图的累计直方图减去第二幅图的累计直方图,取绝对值,然后取一个最大的。然后计算SD这个分量。
累计直方图相减,就是对应像素(相同灰度值)的相减,累加取和。
灰度级直方图不能反映图像的二维变化:因为直方图就是灰度数量的统计,只有颜色个数
取沿着边缘走向的像素的邻域,分析其直方图:所以首先要求一下梯度,找出它的最大方向的梯度,
梯度以后,在直方图上某个灰度范围内,因为它在这个梯度上变化,那么在直方图每个范围内有尖峰,就可以说明在这个范围内纹理是具有方向性的。因为在这个方向上它的梯度值是最大的。
因此,单纯的分析边缘方向的直方图可得到有关纹理的一些信息。就是说,在图像上面取定一个方向,比如水平方向,那么有值,取定另外一个方向,它没值,对于某个有值得方向上的直方图累计一下,水平方向有多少的。
一幅图像就是一个大矩阵,矩阵中的数据是否有相关性?用自相关函数来分析。
自相关函数中:
x,y是位置,是当前像素偏移的位置,是偏移量。水平方向偏移多少,垂直方向偏移多少。
当x,y指定以后(x=1,y=1),当前这个像素乘以f(i+1,j+1)。这循环完以后,结果作为当前像素,再乘以f(i+2,j+2)。
自相关函数计算的这个偏移量,这个偏移量必须先作为已知值带进去,都是已知,不是数学上的未知数,x,y是已知的。
灰度共生矩阵是按照空间规律的未知规律来做的,所以他在纹理分析中非常重要。
概率就是出现的个数
举例如下:
有两幅图,两个矩阵,共有4个灰度级。0,1,2,3.
灰度共生矩阵结果:
灰度共生矩阵分析如下