编程语言
首页 > 编程语言> > 【图像计数】基于matlab灰度二值化同类物体简单计数【含Matlab源码 759期】

【图像计数】基于matlab灰度二值化同类物体简单计数【含Matlab源码 759期】

作者:互联网

一、简介

1 灰度化 (grayscale)

将彩色图像转化为灰度图像的过程称为图像灰度化。彩色图像中的像素值由RGB三个分量决定,每个分量都有0-255(256种)选择,这样一个像素点的像素值可以有1600万种可能(256256256),而灰度图的像素点的像素值是RGB三个分量值相同的一种特殊的彩色图像, 只有256种可能。所以在图像处理中,往往将各种图像首先灰度化成灰度图像以便后续处理,降低计算量。灰度是指只含亮度信息,不含色彩信息的图像。黑白照片就是灰度图,特点是亮度由暗到明,变化是连续的。灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征,

使用灰度图的好处:
① RGB的值都一样。
② 图像数据即调色板索引值,就是实际的RGB值,也就是亮度值。
③ 因为是256色调色板,所以图像数据中一个字节代表一个像素,很整齐。
所以,做图像处理时一般都采用灰度图。
要表示灰度图,就需要把亮度值进行量化,有四种方法:

(1)分量法
将彩色图像中的三分量的亮度作为三个灰度图像的灰度值,可根据应用需要选取一种灰度图像。
(2)最大值法
将彩色图像中的三分量亮度的最大值作为灰度图的灰度值。
(3)均值法
将彩色图像中的三分量亮度求平均得到灰度图的灰度值。
(4)加权平均法
根据重要性及其它指标,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像,f(i,j)=0.30R(i,j)+0.59G(i,j)+0.11B(i,j))。

2 二值化(binaryzation)

图像的二值化是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。所有灰度大于或等于阀值的像素被判定为属于特定物体,其灰度值为255,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。在数字图像处理中,二值图像占有非常重要的地位,首先,图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮廓。其次,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像。
二值化的常用算法有:

全局二值化: 一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,最常用的方法就是设定一个全局的阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群。将大于T的像素群的像素值设定为白色(或者黑色),小于T的像素群的像素值设定为黑色(或者白色)。全局二值化,在表现图像细节方面存在很大缺陷。为了弥补这个缺陷,出现了局部二值化方法。

局部二值化:按照一定的规则将整幅图像划分为N个窗口,对这N个窗口中的每一个窗口再按照一个统一的阈值T将该窗口内的像素划分为两部分,进行二值化处理。局部二值化也有一个缺陷。这个缺陷存在于那个统一阈值的选定。这个阈值是没有经过合理的运算得来,一般是取该窗口的平局值。这就导致在每一个窗口内仍然出现的是全局二值化的缺陷。为了解决这个问题,就出现了局部自适应二值化方法。

局部自适应二值化:在局部二值化的基础之上,将阈值的设定更加合理化。该方法的阈值是通过对该窗口像素的平均值E,像素之间的差平方P,像素之间的均方根值Q等各种局部特征,设定一个参数方程进行阈值的计算,例如:T=aE+bP+c*Q,其中a,b,c是自由参数。这样得出来的二值化图像就更能表现出二值化图像中的细节。

3 反色(inverse)
反色的实际含义是将R、G、B值反转。若颜色的量化级别是256,则新图的R、G、B值为255减去原图的R、G、B值。这里针对的是所有图,包括真彩图、带调色板的彩色图(又称为伪彩色图)、和灰度图。真彩图不带调色板,每个象素用3个字节,表示R、G、B三个分量。所以处理很简单,把反转后的R、G、B值写入新图即可,比如一个点的颜色为(0,0,0),反色后为(255,255,255)。带调色板的彩色图,其位图中的数据只是对应调色板中的一个索引值,我们只需要将调色板中的颜色反转,形成新调色板,而位图数据不用动,就能够实现反转。

二、源代码

clc;%清除命令窗口中的内容
close all;%关闭所有的figure窗口
clear all;%清楚工作空间所有的变量、函数等
I=imread ('C:\Users\lenovo\Desktop\新建文件夹\1.png');%读取蚊香图片
subplot(331);%设置图片显示样式,三行三列,显示位置为第一张
imshow (I) ;%显示原图
title('原图');%命名为“原图”
I = imnoise(I,'speckle',0.8);%加入斑点噪声,模拟现实噪音干扰情况
subplot(332);%显示位置为第二张
imshow(I);%显示加噪后的图片
title('加噪');%命名为“加噪”
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);%将加噪后的彩色图片的R,G,B三分量数据分别存储到矩阵R,G,B中
R= wiener2(R,[15,15]);%对R分量矩阵进行维纳滤波
G= wiener2(G,[10,10]);%对G分量矩阵进行维纳滤波
B= wiener2(B,[5,5]);%对B分量矩阵进行维纳滤波
I(:,:,1)=R;
I(:,:,2)=G;
I(:,:,3)=B;%将滤波后的R,G,B分量再还原给图片,I为滤波处理后的彩色图片
subplot(333);%显示位置为第三个
imshow(I);%显示滤波后的图片
title('维纳滤波后');%命名为“维纳滤波后”
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);%将图片的R、G、B分量数据分别存储到矩阵R,G,B中
R((R<=60|R>=130)|(G<=120|G>=180))=255;%使用photoshop取色工具分别取蚊香片和背景的的R,G,B分量
G((R<=60|R>=130)|(G<=120|G>=180))=255;
B((R<=60|R>=130)|(G<=120|G>=180))=255;%将R,G,B三个分量矩阵中的数据进行处理,不属于蚊香片颜色区间的置为白色
I(:,:,1)=R;
I(:,:,2)=G;
I(:,:,3)=B;%将处理过的三色数据赋给原图
I1=rgb2gray(I);%将真彩图像转换为灰度图像
subplot(334);%显示位置为第四个
imshow(I1);%显示处理后的灰度图像
title('灰度图像');%命名为“灰度图像”
thresh=graythresh(I1);%使用grathresh函数,找到灰度图像的合适阈值
I2=im2bw(I1,thresh);%使用阈值将灰度图像变成二值图像
subplot(335);%显示位置为第五个
imshow(I2);%显示二值图像I2
title('二值图像');%命名为“二值图像”
SE0=strel('disk',5);%在进行膨胀、腐蚀操作前,需要创建一个掩膜(mask),这里创建一个半径为5的平面圆盘状掩膜,SE0是一个矩阵
SE=strel('disk',12);%在进行膨胀、腐蚀操作前,需要创建一个掩膜(mask),这里创建一个半径为12的平面圆盘状掩膜,SE是一个矩阵
I2=imdilate(I2,SE0);%进行膨胀操作,白色部分扩张,消除维纳滤波没过滤干净的噪声(主要为边界区域)
subplot(336);%显示位置为第6个

三、运行结果

在这里插入图片描述

四、备注

版本:2014a

标签:像素,计数,源码,灰度,图像,255,二值化,分量
来源: https://blog.51cto.com/u_15287606/2976086