发明内容
本发明的目的在于克服现有技术的不足,提供一种可对各种类型的图像进行精准的灰度化处理,并保持原图像中的图案、纹理、对比度等重要细节信息,从而为图像后续的处理提供可靠的保障的彩色图像自适应去色方法。
本发明的目的是通过以下技术方案来实现的:一种彩色图像自适应去色方法,包括以下步骤:
S1、读入原始图像,并进行初始化操作:读入原始图像并以srcImg矩阵变量表示,srcImg矩阵中的每个元素表示原始图像的一个像素点;
定义灰度图像的灰度级,以变量Level表示;
定义存储即将生成的灰度化图像的矩阵变量dstImg;
S2、采用KMeans聚类算法对srcImg矩阵中的元素按照设定的灰度级Level进行聚类运算操作,并存储在聚类结果矩阵变量Labels中;
S3、对所有像素点,逐一取得其所属的聚类号,然后求取每个像素点的颜色值,并将同属于相同聚类的像素的颜色值进行累加,得到同一聚类中所包含的所有像素的颜色值之和即为该聚类的颜色值,并将计算结果存储在聚类颜色值数组变量pixsum相应的聚类元素中,接着计算每组聚类所包含的像素数目;
S4、计算pixsum中各个聚类元素颜色值的总和、平均值、最大值和最小值;
S5、求解步骤S4得到的各个聚类元素的最大和最小颜色值的差值,并据此计算每个灰度级单位对应的颜色值;
S6、计算每个灰度级分别对应的颜色值范围;
S7、对灰度图矩阵dstImg的各个像素点,根据原始图像矩阵srcImg中相应的各像素点所对应的聚类号,依次赋予相应的灰度级。
进一步地,所述步骤S1具体包括以下子步骤:
S11、读入原始图像,并取得原始图像的列数、行数、通道数、像素数、各像素的RGB值;将原始图像以srcImg矩阵变量表示,srcImg矩阵的列数、行数、通道数,分别以Width、Height、Chanels变量表示;
取得srcImg矩阵的像素点的数量,以变量Count表示,计算公式为:Count=Width*Height;
取得srcImg矩阵各像素点的RGB值,对真彩色图像而言,每个像素由3个字节构成,高字节存储红色通道R数据,中字节存储G绿色通道数据,低字节存储蓝色通道B数据;如果读入的图像本身就是灰度图像,则令RGB三个通道为一样的值,即:R=G=B=读入的灰度值;
S12、定义必要参数:定义用户输入的灰度图像的灰度级,以变量Level表示;
定义聚类矩阵变量Pnts,用于临时存储图像数据,其行数、列数的值分别为Count和Chanels变量的值;
定义聚类中心矩阵变量Centers,其行数、列数的值的值分别为Level和1;
定义各像素的聚类结果矩阵变量Labels,其行数、列数的值分别为Count和1;
定义存储即将生成的灰度化图像的矩阵变量dstImg,其行数、列数的值分别为Width、Height;
S13、将原始图像矩阵srcImg中每个像素的RGB颜色值依次赋给聚类矩阵Pnts中相对应的元素,从而完成聚类矩阵变量Pnts的初始化。
本发明的有益效果是:本发明提出一种自适应的彩色图像去色方法,可对各种类型的图像进行精准的灰度化处理,并保持原图像中的图案、纹理、对比度等重要细节信息,从而为图像后续的处理提供可靠的保障。
具体实施方式
下面结合附图进一步说明本发明的技术方案。
如图1所示,本发明的一种彩色图像自适应去色方法,包括以下步骤:
S1、读入原始图像,并进行初始化操作:读入一幅3通道(也可为其它通道数)的原始图像并以srcImg矩阵变量表示,srcImg矩阵中的每个元素表示原始图像的一个像素点;
定义灰度图像的灰度级,以变量Level表示;
定义存储即将生成的灰度化图像的矩阵变量dstImg;
具体包括以下子步骤:
S11、读入原始图像,并取得原始图像的列数、行数、通道数、像素数、各像素的RGB值;将原始图像以srcImg矩阵变量表示,srcImg矩阵的列数、行数、通道数,分别以Width、Height、Chanels变量表示;
取得srcImg矩阵的像素点的数量,以变量Count表示,计算公式为:Count=Width*Height;
取得srcImg矩阵各像素点的RGB值,对真彩色图像而言,每个像素由3个字节构成,高字节存储红色通道R数据,中字节存储G绿色通道数据,低字节存储蓝色通道B数据;如果读入的图像本身就是灰度图像,则令RGB三个通道为一样的值,即:R=G=B=读入的灰度值;
S12、定义必要参数:定义用户输入的灰度图像的灰度级,以变量Level表示,Level预设值通常为256,也可为大于或等于2的其它正整数;
定义聚类矩阵变量Pnts,用于临时存储图像数据,其行数、列数的值分别为Count和Chanels变量的值;
定义聚类中心矩阵变量Centers,其行数、列数的值的值分别为Level和1;
定义各像素的聚类结果矩阵变量Labels,其行数、列数的值分别为Count和1;
定义存储即将生成的灰度化图像的矩阵变量dstImg,其行数、列数的值分别为Width、Height;
S13、将原始图像矩阵srcImg中每个像素的RGB颜色值依次赋给聚类矩阵Pnts中相对应的元素,从而完成聚类矩阵变量Pnts的初始化;伪码表示如下(其中双斜线//表示注释,注释是对其后的代码进行的算法描述,下同):
//对总共Count个像素循环访问一遍
for(i=0;i<Count;i++)
Pnts[i,0]=srcImg[i,0];
Pnts[i,1]=srcImg[i,1];
Pnts[i,2]=srcImg[i,2];
S2、采用KMeans聚类算法对srcImg矩阵中的元素按照设定的聚类数(即灰度级Level)进行聚类运算操作,得到Level组聚类,总共Count个元素的聚类结果,并存储在聚类结果矩阵变量Labels中;
S3、对所有像素点(总共Count个),逐一取得其所属的聚类号,然后求取每个像素点的颜色值,并将同属于相同聚类的像素的颜色值进行累加,得到同一聚类中所包含的所有像素的颜色值之和即为该聚类的颜色值,并将计算结果存储在聚类颜色值数组变量pixsum相应的聚类元素中,接着计算每组聚类所包含的像素数目(以数组变量labelcount表示);
其中,对某个聚类中所包含的某个像素点而言,求取其颜色值的公式为:
pixsum[聚类编号]=(srcImg[i,2]*299*λ1+srcImg[i,1]*587*λ2+srcImg[i,0]*114*λ3)/β。
其中,聚类编号取值范围为0-Level,srcImg数组中的i取值范围为0–Count,λ1、λ2、λ3、β分别为可调参数,根据多次实验表明,当λ1、λ2、λ3、β取值分别为575、255、70、100000.0时,本发明能获得很好的去色效果。本步骤的主要伪码表示如下:
for(i=0;i<Count;i++)
//变量label用于存储获取到的聚类号,下一语句用于取得各像素点所属的聚类号
clustNo=Labels[i,0];
for(k=0;k<Level;k++)
if(k==clustNo){
pixsum[clustNo]+=(srcImg[i,2]*299*λ1+srcImg[i,1]*587*λ2+srcImg[i,0]*114*λ3)/β;
labelcount[clustNo]++;
//退出内层循环,开始下一轮外层循环
break;
S4、对所有Level个聚类,计算pixsum中各个聚类元素颜色值的总和、平均值、最大值和最小值;
在计算之前,最大颜色值maxColorCode和最小颜色值minColorCode的初值分别为-1和0XFFFFFF,伪码表示如下:
for(k=0;k<Level;k++){
//下一句计算出各个聚类的平均颜色值,平均颜色值=该聚类的颜色值除以该聚类所包含的像素数目
pixsum[k]/=labelcount[k];
//变量pixsumTotal用于存储数组pixsum中各元素值的总和
pixsumTotal+=pixsum[k];
//计算最大颜色值,结果保存在变量maxColorCode中
if(pixsum[k]>maxColorCode)
maxColorCode=pixsum[k];
//计算最小颜色值,结果保存在变量minColorCode中
if(pixsum[k]<minColorCode)
minColorCode=pixsum[k];
S5、求解步骤S4得到的各个聚类元素的最大和最小颜色值的差值,并据此计算每个灰度级单位对应的颜色值;伪码表示如下:
//计算出最大与最小颜色值之差
minmaxgapColorCode=maxColorCode-minColorCode;
//计算出每个灰度级单位对应的颜色值
ColorCodePerLevel=minmaxgapColorCode/Level;
S6、计算计算转化到灰度图之前,每个灰度级分别对应的颜色值范围,计算结果保存在灰度级数组变量GrayLevelByLabel(显然,该数组元素数量有Level个)中;对超过最大灰度值范围(以变量MAXPIXVALUE表示,如对256级灰度图而言,该值为255)的计算结果值,调整其值为最大灰度值MAXPIXVALUE,伪码表示如下:
S7、对灰度图矩阵dstImg的各个像素点,根据原始图像矩阵srcImg中相应的各像素点所对应的聚类号,依次赋予相应的灰度级;伪码如下:
for(i=0;i<Count;i++)
//变量clustNo用于存储获取到的聚类号
clustNo=Labels[i,0];
//逐像素赋予灰度级
dstImg[i]=GrayLevelByLabel[clustNo];
经过上述7个步骤,即完成了将一幅原始彩色图像(亦可为灰度图像)srcImg去色转换成了灰度图像dstImg。本专利方法及系统可在计算机、手机、其它移动终端、各种嵌入式(检测)设备等需要进行图像去色处理的设备上部署并工作,具有广阔的应用前景。
为便于对比分析,本发明选取了六种常见的图像类型,包括普通图像(图2和图3)、有雾图像(图4和图5)、水下图像(图6和图7)、过曝光图像(图8)、欠曝光图像(图9)、高对比度图像(图10和图11),图像均为3通道24位真彩色图像,都转换为256级灰度图,分别在PS、开源软件OpenCV以及本发明的方法(经过上述7个步骤述算法处理后)上进行灰度化处理,图2-11分别展示了原图以及三种方法的灰度化(去色)效果(需要说明的是,由于专利文本中不允许使用彩色图像,因此本实施例中将原始的彩色图像先用MatLab软件转换成灰度图像,以代替原始的彩色图像)。图中,(a)、(b)、(c)、(d)分别为原彩色图像的MatLab灰度化图像、PS灰度化图像、OpenCV灰度化图像、本发明方法的灰度化图像。
分析、比较以上六种类型的图像灰度化处理结果可以看出,无论是PS还是OpenCV,经过灰度化后,在图案、纹理、对比度、清晰度等重要细节信息方面都或多或少的有一些损失,无法完全确保忠实于原图,而经本专利方法灰度化后的图像在图案、纹理、对比度、清晰度等重要细节方面都与原图像比较吻合,特别是在对有雾、水下、过曝光、欠曝光、高对比度这几类图像进行灰度化时,本发明的方法效果尤其显著。
本领域的普通技术人员将会意识到,这里所述的实施例是为了帮助读者理解本发明的原理,应被理解为本发明的保护范围并不局限于这样的特别陈述和实施例。本领域的普通技术人员可以根据本发明公开的这些技术启示做出各种不脱离本发明实质的其它各种具体变形和组合,这些变形和组合仍然在本发明的保护范围内。