c++ opencv编程实现暗通道图像去雾算法_OpenCV图像处理专栏十五 |一种基于亮度均衡的图像阈值分割技术...
生活随笔
收集整理的這篇文章主要介紹了
c++ opencv编程实现暗通道图像去雾算法_OpenCV图像处理专栏十五 |一种基于亮度均衡的图像阈值分割技术...
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前言
對于光照不均勻的圖像,用通常的圖像分割方法不能取得滿意的效果。為了解決這個(gè)問題,論文《一種基于亮度均衡的圖像閾值分割技術(shù)》提出了一種實(shí)用而簡便的圖像分割方法。該方法針對圖像中不同亮度區(qū)域進(jìn)行亮度補(bǔ)償,使得整個(gè)圖像亮度背景趨于一致后,再進(jìn)行常規(guī)的閾值分割。實(shí)驗(yàn)結(jié)果表明,用該方法能取得良好的分割效果。關(guān)于常規(guī)的閾值分割不是我這篇推文關(guān)注的,我這里只實(shí)現(xiàn)前面光照補(bǔ)償?shù)牟糠?。算法的原理可以仔?xì)看論文。論文原文見附錄。
算法步驟
- 如果是RGB圖需要轉(zhuǎn)化成灰度圖。
- 求取原始圖src的平均灰度,并記錄rows和cols。
- 按照一定大小,分為個(gè)方塊,求出每塊的平均值,得到子塊的亮度矩陣。
- 用矩陣的每個(gè)元素減去原圖的平均灰度,得到子塊的亮度差值矩陣。
- 用雙立方插值法,將矩陣?resize成和原圖一樣大小的亮度分布矩陣。
- 得到矯正后的圖像:。
代碼實(shí)現(xiàn)
Mat speed_rgb2gray(Mat src) {Mat dst(src.rows, src.cols, CV_8UC1);
#pragma omp parallel for num_threads(12)
for (int i = 0; i < src.rows; i++) {
for (int j = 0; j < src.cols; j++) {
dst.at(i, j) = ((src.at(i, j)[0] << 18) + (src.at(i, j)[0] << 15) + (src.at(i, j)[0] << 14) +
(src.at(i, j)[0] << 11) + (src.at(i, j)[0] << 7) + (src.at(i, j)[0] << 7) + (src.at(i, j)[0] << 5) +
(src.at(i, j)[0] << 4) + (src.at(i, j)[0] << 2) +
(src.at(i, j)[1] << 19) + (src.at(i, j)[1] << 16) + (src.at(i, j)[1] << 14) + (src.at(i, j)[1] << 13) +
(src.at(i, j)[1] << 10) + (src.at(i, j)[1] << 8) + (src.at(i, j)[1] << 4) + (src.at(i, j)[1] << 3) + (src.at(i, j)[1] << 1) +
(src.at(i, j)[2] << 16) + (src.at(i, j)[2] << 15) + (src.at(i, j)[2] << 14) + (src.at(i, j)[2] << 12) +
(src.at(i, j)[2] << 9) + (src.at(i, j)[2] << 7) + (src.at(i, j)[2] << 6) + (src.at(i, j)[2] << 5) + (src.at(i, j)[2] << 4) + (src.at(i, j)[2] << 1) >> 20);
}
}
return dst;
}
Mat unevenLightCompensate(Mat src, int block_Size) {
int row = src.rows;
int col = src.cols;
Mat gray(row, col, CV_8UC1);
if (src.channels() == 3) {
gray = speed_rgb2gray(src);
}
else {
gray = src;
}
float average = mean(gray)[0];
int new_row = ceil(1.0 * row / block_Size);
int new_col = ceil(1.0 * col / block_Size);
Mat new_img(new_row, new_col, CV_32FC1);
for (int i = 0; i < new_row; i++) {
for (int j = 0; j < new_col; j++) {
int rowx = i * block_Size;
int rowy = (i + 1) * block_Size;
int colx = j * block_Size;
int coly = (j + 1) * block_Size;
if (rowy > row) rowy = row;
if (coly > col) coly = col;
Mat ROI = src(Range(rowx, rowy), Range(colx, coly));
float block_average = mean(ROI)[0];
new_img.at(i, j) = block_average;
}
}
new_img = new_img - average;
Mat new_img2;
resize(new_img, new_img2, Size(row, col), (0, 0), (0, 0), INTER_CUBIC);
Mat new_src;
gray.convertTo(new_src, CV_32FC1);
Mat dst = new_src - new_img2;
dst.convertTo(dst, CV_8UC1);
return dst;
}
效果
可以看到經(jīng)過這個(gè)算法處理之后,亮度確實(shí)被均衡了一些,從視覺效果上來看還是有作用的。
附錄
- 論文原文:https://wenku.baidu.com/view/f74cc087e53a580216fcfe52.html?from=search
同期文章
- OpenCV圖像處理專欄一 | 盤點(diǎn)常見顏色空間互轉(zhuǎn)
- OpenCV圖像處理專欄二 |《Local Color Correction 》論文閱讀及C++復(fù)現(xiàn)
- OpenCV圖像處理專欄三 | 灰度世界算法原理和實(shí)現(xiàn)
- OpenCV圖像處理專欄四 | 自動(dòng)白平衡之完美反射算法原理及C++實(shí)現(xiàn)
- OpenCV圖像處理專欄五 | ACE算法論文解讀及實(shí)現(xiàn)
- OpenCV圖像處理專欄六 | 來自何凱明博士的暗通道去霧算法(CVPR 2009最佳論文)
- OpenCV圖像處理專欄七 | 直方圖均衡化算法及代碼實(shí)現(xiàn)
- OpenCV圖像處理專欄八 | 《Contrast image correction method》 論文閱讀及代碼實(shí)現(xiàn)
- OpenCV圖像處理專欄九 | 基于直方圖的快速中值濾波算法
- OpenCV圖像處理專欄十 | 利用中值濾波進(jìn)行去霧
- OpenCV圖像處理專欄十一 | IEEE Xplore 2015的圖像白平衡處理之動(dòng)態(tài)閾值法
- OpenCV圖像處理專欄十二 |《基于二維伽馬函數(shù)的光照不均勻圖像自適應(yīng)校正算法》
- OpenCV圖像處理專欄十三 | 利用多尺度融合提升圖像細(xì)節(jié)
- OpenCV圖像處理專欄十四 | 基于Retinex成像原理的自動(dòng)色彩均衡算法(ACE)
歡迎關(guān)注GiantPandaCV, 在這里你將看到獨(dú)家的深度學(xué)習(xí)分享,堅(jiān)持原創(chuàng),每天分享我們學(xué)習(xí)到的新鮮知識。( ? ?ω?? )?
有對文章相關(guān)的問題,或者想要加入交流群,歡迎添加BBuf微信:
在這里插入圖片描述總結(jié)
以上是生活随笔為你收集整理的c++ opencv编程实现暗通道图像去雾算法_OpenCV图像处理专栏十五 |一种基于亮度均衡的图像阈值分割技术...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一种电冰箱原价2500元,现在每台售价2
- 下一篇: python seek tell_Pyt