您好,登錄后才能下訂單哦!
這篇文章給大家介紹灰度世界算法原理及C++實現的示例分析,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
前置內容
人的視覺系統具有顏色恒常性,能從變化的光照環境和成像條件下獲取物體表面顏色的不變特性,但成像設備并不具有這樣的調節功能,不同的光照環境會導致采集到的圖像顏色與真實顏色存在一定程度的偏差,需要選擇合適的顏色平衡算法去消除光照環境對顏色顯示的影響。
灰度世界算法原理
灰度世界算法以灰度世界假設為基礎,假設為:對于一幅有著大量色彩變化的圖像,RGB3個分量的平均值趨于同一個灰度值Gray。從物理意思上講,灰度世界算法假設自然界景物對于光線的平均反射的均值在整體上是一個定值,這個定值近似為“灰色”。顏色平衡算法將這一假設強制應用于待處理的圖像,可以從圖像中消除環境光的影響,獲得原始場景圖像。
算法步驟
此算法簡單快速,但是當圖像場景顏色并不豐富時,尤其是出現大量單色物體時,該算法會失效。
源碼實現
Mat GrayWorld(Mat src) { vector <Mat> bgr; cv::split(src, bgr); double B = 0; double G = 0; double R = 0; int row = src.rows; int col = src.cols; Mat dst(row, col, CV_8UC3); for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { B += 1.0 * src.at<Vec3b>(i, j)[0]; G += 1.0 * src.at<Vec3b>(i, j)[1]; R += 1.0 * src.at<Vec3b>(i, j)[2]; } } B /= (row * col); G /= (row * col); R /= (row * col); printf("%.5f %.5f %.5f\n", B, G, R); double GrayValue = (B + G + R) / 3; printf("%.5f\n", GrayValue); double kr = GrayValue / R; double kg = GrayValue / G; double kb = GrayValue / B; printf("%.5f %.5f %.5f\n", kb, kg, kr); for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { dst.at<Vec3b>(i, j)[0] = (int)(kb * src.at<Vec3b>(i, j)[0]) > 255 ? 255 : (int)(kb * src.at<Vec3b>(i, j)[0]); dst.at<Vec3b>(i, j)[1] = (int)(kg * src.at<Vec3b>(i, j)[1]) > 255 ? 255 : (int)(kg * src.at<Vec3b>(i, j)[1]); dst.at<Vec3b>(i, j)[2] = (int)(kr * src.at<Vec3b>(i, j)[2]) > 255 ? 255 : (int)(kr * src.at<Vec3b>(i, j)[2]); } } return dst;}
效果圖
結論
可以看到灰度世界算法有了白平衡的效果,并且該算法的執行速度非常之快。
關于灰度世界算法原理及C++實現的示例分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。