RGB 尋找傳說中的black

B亮度:亮度是光作用于人眼所引起的明亮程度的感覺,它與被觀察物體的發(fā)光強度有關(guān)。主要表現(xiàn)光的強和弱。

H色調(diào):色調(diào)是當人眼看一種或多種波長的光時所產(chǎn)生的色彩感覺,它反映顏色的種類,是決定顏色的基本特征。

S飽和度:飽和度是指顏色的純度即摻入白光的程度,表示顏色深淺的程度。


一張圖片,比如身份證,里面的字本身是黑色的,但是在不同光線,明暗度拍照出來的結(jié)果,圖片會變的各種各樣的顏色值。簡單的說他們的灰度分布值是不一樣的。有時候一張圖片,某個地方是比較白,有些地方某些地方比較暗;

而要處理一張圖片的二值化,或者找出相對黑,然后加黑;變的沒有那么簡單;

1、既然想到不同區(qū)域影響比較大,于是想到做分塊處理;把一張圖片切成N等分;然后再處理;N=?,分塊的結(jié)果,應(yīng)該是到達均值化的要求。也是說每一塊圖片它的圖片明暗差別不大;理論上得去尋找均值化的B值,往x方向找均值B,一但發(fā)現(xiàn)一個點的B值與均值B相差很大,比如說10,則停止查找,然后找y的方向;這樣就切出一塊了;這種的話很可能效率比較低;這里提供一種簡單的切塊:切最大的平均正方形,一個長方形總可以切成多個都是正方形的圖形;

還有一種,是根據(jù)實際的場景來切分;

2、按經(jīng)驗;gray<128,比較黑;但是在已經(jīng)很暗的情況下就效果很差;在已經(jīng)很亮的情況下效果也比較差;

所以先去尋找均值化的gray值;為grayJ,grayJ<128;那么從新分布下gray<grayJ, 統(tǒng)計blackCount;blackGray;

whiteGray;whiteCount;計算出blackJ和whiteJ;則gray<blackJ 基本上設(shè)置gray=0;blackJ~grayJ 這里的值,則應(yīng)該根據(jù)B、S的值,gray相應(yīng)做處理;按道理應(yīng)該是線性關(guān)系。gray>whiteGray,則基本上為白;grayJ~whiteGray,則應(yīng)該根據(jù)B、S的值,gray相應(yīng)做處理。

grayJ>128;>198,說明圖片已經(jīng)很白了;這時候很可能黑的個數(shù)沒有幾個;如果調(diào)高了blackJ 這會把本來是白變成黑了;如果blackJ不夠高;則達不到加黑的效果;于是這時候想把圖片的灰度分布做分析;字比較黑的應(yīng)該有灰度分布比較集中,而且值比其他的值比較低;

3、尋找gray black的灰度分布;

圖片w、h (寬高)既有w*h個點;每個點都要一個gray值;如何分布;按道理值比較集中的為一個組;

這里就需要一個排序算法;于是想到了直方圖,從這個方向作為切入點;可以把圖片進行二值化操作;


-------------------------------------------------------------------------------------------------------------------

調(diào)整為灰度-調(diào)整色階

調(diào)整亮度(-150最小)和對比度(100最大) 這種算法比較靠譜

反相 算法

發(fā)現(xiàn)這幾種比較靠譜還是在于調(diào)整亮度與對比度

調(diào)整亮度:發(fā)現(xiàn)圖片識別率并不高

關(guān)照矯正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);// 定義結(jié)構(gòu)元素cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(15, 15));cv::Mat topHatMat, blackHatMat;// 形態(tài)學(xué)Top-Hat 頂帽cv::morphologyEx(srcGray, topHatMat,cv::MORPH_TOPHAT, element);// 形態(tài)學(xué)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;}


-------------------------------------------------------------------------------------------------------------------

關(guān)于圖片的二值化:

閾值化(thresholding)可以看作是削波的一個特例,我們用下圖說明閾值化的原理。

閾值化的原理

不難看出,只要令削波中的g1old=g2old就實現(xiàn)了閾值化。閾值就象個門檻,比它大就是白,比它小就是黑。經(jīng)過閾值化處理后的圖象變成了黑白二值圖,所以說閾值化是灰度圖轉(zhuǎn)二值圖的一種常用方法(我們以前介紹過圖案化和抖動的方法)。進行閾值化只需給出閾值點g1old即可。一般情況下,閾值的選取對程序執(zhí)行結(jié)果有很大的影響,在本程序中采取的是直方圖求門限,迭代法求最佳閾值的方法,這個方法在數(shù)學(xué)上已被證明當圖像像素概率分布逼近正態(tài)分布時是最佳的。閾值化處理后的結(jié)果,是一幅二值圖像

閾值化處理后的結(jié)果

在這里,閾值的選取是很重要的,閾值如果過高,就會產(chǎn)生將圖像主體誤認為是背景的情況;閾值如果過低,則會將背景部分誤認為是主體部分。因此,我們應(yīng)該仔細選擇閾值,我認為閾值不應(yīng)該是一個固定的值,它的值應(yīng)該隨著圖像的不同而不同。在本程序中,采取了動態(tài)求取閾值的方法。首先我們先求得被處理圖像的灰度直方圖,根據(jù)直方圖求得最大灰度與最小灰度。我們設(shè)置閾值的初值為最大灰度與最小灰度值之和的一半。然后求得小于閾值部分灰度的平均值iMean1Gray和大于閾值部分的平均值iMean2Gray,將閾值重新設(shè)為這兩個灰度均值 的一半,如此迭代,最后求得最佳閾值iThreshold。實驗結(jié)果證明該閾值是可信的,基本上可以把主體與背景區(qū)分開來。求閾值的代碼如下:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 不同圖像灰度不同,邊界處一般會有明顯的邊緣,利用此特征可以分割圖像。需要說明的是:邊緣和物體間的邊界并不等同,邊緣...
    大川無敵閱讀 13,948評論 0 29
  • 前言opencv在圖像處理中使用廣泛,許多常見的應(yīng)用場景例如人臉識別,車牌識別等都是基于opencv開發(fā)的。本文是...
    肖丹晨閱讀 5,049評論 0 4
  • 最近需要給直播項目中添加美顏的功能,調(diào)研了很多SDK和開源代碼(視決,涂圖,七牛,金山云,videoCore等),...
    未來的路就在那閱讀 2,053評論 1 1
  • 一點背景知識 OpenCV 是一個開源的計算機視覺和機器學(xué)習(xí)庫。它包含成千上萬優(yōu)化過的算法,為各種計算機視覺應(yīng)用提...
    沬日十七閱讀 1,026評論 0 4
  • 我忘了 怎么去 了解別人的感覺
    也許Y閱讀 178評論 0 1