B亮度:亮度是光作用于人眼所引起的明亮程度的感觉,它与被观察物体的发光强度有关。主要表现光的强和弱。
H色调:色调是当人眼看一种或多种波长的光时所产生的色彩感觉,它反映颜色的种类,是决定颜色的基本特征。
S饱和度:饱和度是指颜色的纯度即掺入白光的程度,表示颜色深浅的程度。
一张图片,比如身份证,里面的字本身是黑色的,但是在不同光线,明暗度拍照出来的结果,图片会变的各种各样的颜色值。简单的说他们的灰度分布值是不一样的。有时候一张图片,某个地方是比较白,有些地方某些地方比较暗;
而要处理一张图片的二值化,或者找出相对黑,然后加黑;变的没有那么简单;
1、既然想到不同区域影响比较大,于是想到做分块处理;把一张图片切成N等分;然后再处理;N=?,分块的结果,应该是到达均值化的要求。也是说每一块图片它的图片明暗差别不大;理论上得去寻找均值化的B值,往x方向找均值B,一但发现一个点的B值与均值B相差很大,比如说10,则停止查找,然后找y的方向;这样就切出一块了;这种的话很可能效率比较低;这里提供一种简单的切块:切最大的平均正方形,一个长方形总可以切成多个都是正方形的图形;
还有一种,是根据实际的场景来切分;
2、按经验;gray<128,比较黑;但是在已经很暗的情况下就效果很差;在已经很亮的情况下效果也比较差;
所以先去寻找均值化的gray值;为grayJ,grayJ<128;那么从新分布下gray<grayJ, 统计blackCount;blackGray;
whiteGray;whiteCount;计算出blackJ和whiteJ;则gray<blackJ 基本上设置gray=0;blackJ~grayJ 这里的值,则应该根据B、S的值,gray相应做处理;按道理应该是线性关系。gray>whiteGray,则基本上为白;grayJ~whiteGray,则应该根据B、S的值,gray相应做处理。
grayJ>128;>198,说明图片已经很白了;这时候很可能黑的个数没有几个;如果调高了blackJ 这会把本来是白变成黑了;如果blackJ不够高;则达不到加黑的效果;于是这时候想把图片的灰度分布做分析;字比较黑的应该有灰度分布比较集中,而且值比其他的值比较低;
3、寻找gray black的灰度分布;
图片w、h (宽高)既有w*h个点;每个点都要一个gray值;如何分布;按道理值比较集中的为一个组;
这里就需要一个排序算法;于是想到了直方图,从这个方向作为切入点;可以把图片进行二值化操作;
-------------------------------------------------------------------------------------------------------------------
调整为灰度-调整色阶
调整亮度(-150最小)和对比度(100最大) 这种算法比较靠谱
反相 算法
发现这几种比较靠谱还是在于调整亮度与对比度
调整亮度:发现图片识别率并不高
关照矫正top-hat效果不好改用MORPH_BLACKHAT
#include #include #include #includeint main(){cv::Mat srcImage = cv::imread("19.jpg");if (!srcImage.data)return 1;cv::Mat srcGray;cv::cvtColor(srcImage, srcGray, CV_RGB2GRAY);// 定义结构元素cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(15, 15));cv::Mat topHatMat, blackHatMat;// 形态学Top-Hat 顶帽cv::morphologyEx(srcGray, topHatMat,cv::MORPH_TOPHAT, element);// 形态学Top-Hat 黑帽cv::morphologyEx(srcGray, blackHatMat,cv::MORPH_BLACKHAT, element);cv::imshow(" srcGray ", srcGray);cv::imshow(" topHatMat ", topHatMat);cv::imshow(" blackHatMat ", blackHatMat);cv::waitKey();return 0;}
-------------------------------------------------------------------------------------------------------------------
关于图片的二值化:
阈值化(thresholding)可以看作是削波的一个特例,我们用下图说明阈值化的原理。
阈值化的原理
不难看出,只要令削波中的g1old=g2old就实现了阈值化。阈值就象个门槛,比它大就是白,比它小就是黑。经过阈值化处理后的图象变成了黑白二值图,所以说阈值化是灰度图转二值图的一种常用方法(我们以前介绍过图案化和抖动的方法)。进行阈值化只需给出阈值点g1old即可。一般情况下,阈值的选取对程序执行结果有很大的影响,在本程序中采取的是直方图求门限,迭代法求最佳阈值的方法,这个方法在数学上已被证明当图像像素概率分布逼近正态分布时是最佳的。阈值化处理后的结果,是一幅二值图像
阈值化处理后的结果
在这里,阈值的选取是很重要的,阈值如果过高,就会产生将图像主体误认为是背景的情况;阈值如果过低,则会将背景部分误认为是主体部分。因此,我们应该仔细选择阈值,我认为阈值不应该是一个固定的值,它的值应该随着图像的不同而不同。在本程序中,采取了动态求取阈值的方法。首先我们先求得被处理图像的灰度直方图,根据直方图求得最大灰度与最小灰度。我们设置阈值的初值为最大灰度与最小灰度值之和的一半。然后求得小于阈值部分灰度的平均值iMean1Gray和大于阈值部分的平均值iMean2Gray,将阈值重新设为这两个灰度均值 的一半,如此迭代,最后求得最佳阈值iThreshold。实验结果证明该阈值是可信的,基本上可以把主体与背景区分开来。求阈值的代码如下: