OpenCV 圖像對(duì)比度的實(shí)踐
本文主要介紹了OpenCV 圖像對(duì)比度,具有一定的參考價(jià)值,感興趣的可以了解一下
實(shí)現(xiàn)原理
圖像對(duì)比度指的是一幅圖像中明暗區(qū)域最亮的白和最暗的黑之間不同亮度層級(jí)的測(cè)量,即指一幅圖像灰度反差的大小。差異范圍越大代表對(duì)比越大,差異范圍越小代表對(duì)比越小。設(shè)置一個(gè)基準(zhǔn)值thresh,當(dāng)percent大于0時(shí),需要令圖像中的顏色對(duì)比更強(qiáng)烈,即數(shù)值距離thresh越遠(yuǎn),則變化越大;當(dāng)percent等于1時(shí),對(duì)比強(qiáng)到極致,只有255和0的區(qū)分;當(dāng)percent等于0時(shí),不變;當(dāng)percent小于0時(shí),對(duì)比下降,即令遠(yuǎn)離thresh的數(shù)值更近些;當(dāng)percent等于-1時(shí),沒(méi)有對(duì)比了,全是thresh值。
對(duì)比度調(diào)整算法的實(shí)現(xiàn)流程如下:
1.設(shè)置調(diào)整參數(shù)percent,取值為-100到100,類(lèi)似PS中設(shè)置,歸一化后為-1到1。
2.針對(duì)圖像所有像素點(diǎn)單個(gè)處理。當(dāng)percent大于等于0時(shí),對(duì)比增強(qiáng),調(diào)整后的RGB三通道數(shù)值為:
3.若percent小于0時(shí),對(duì)比降低,此時(shí)調(diào)整后的圖像RGB三通道值為:
4.若percent等于1時(shí),大于thresh則等于255,小于則等于0。
至此,圖像實(shí)現(xiàn)了明度的調(diào)整,算法邏輯參考xingyanxiao。C++實(shí)現(xiàn)代碼如下。
功能函數(shù)代碼
// 對(duì)比度 cv::Mat Contrast(cv::Mat src, int percent) { float alpha = percent / 100.f; alpha = max(-1.f, min(1.f, alpha)); cv::Mat temp = src.clone(); int row = src.rows; int col = src.cols; int thresh = 127; for (int i = 0; i < row; ++i) { uchar *t = temp.ptr<uchar>(i); uchar *s = src.ptr<uchar>(i); for (int j = 0; j < col; ++j) { uchar b = s[3 * j]; uchar g = s[3 * j + 1]; uchar r = s[3 * j + 2]; int newb, newg, newr; if (alpha == 1) { t[3 * j + 2] = r > thresh ? 255 : 0; t[3 * j + 1] = g > thresh ? 255 : 0; t[3 * j] = b > thresh ? 255 : 0; continue; } else if (alpha >= 0) { newr = static_cast<int>(thresh + (r - thresh) / (1 - alpha)); newg = static_cast<int>(thresh + (g - thresh) / (1 - alpha)); newb = static_cast<int>(thresh + (b - thresh) / (1 - alpha)); } else { newr = static_cast<int>(thresh + (r - thresh) * (1 + alpha)); newg = static_cast<int>(thresh + (g - thresh) * (1 + alpha)); newb = static_cast<int>(thresh + (b - thresh) * (1 + alpha)); } newr = max(0, min(255, newr)); newg = max(0, min(255, newg)); newb = max(0, min(255, newb)); t[3 * j + 2] = static_cast<uchar>(newr); t[3 * j + 1] = static_cast<uchar>(newg); t[3 * j] = static_cast<uchar>(newb); } } return temp; }
C++測(cè)試代碼
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; cv::Mat Contrast(cv::Mat src, int percent); int main() { cv::Mat src = imread("5.jpg"); cv::Mat result = Contrast(src, 50.f); imshow("original", src); imshow("result", result); waitKey(0); return 0; } // 對(duì)比度 cv::Mat Contrast(cv::Mat src, int percent) { float alpha = percent / 100.f; alpha = max(-1.f, min(1.f, alpha)); cv::Mat temp = src.clone(); int row = src.rows; int col = src.cols; int thresh = 127; for (int i = 0; i < row; ++i) { uchar *t = temp.ptr<uchar>(i); uchar *s = src.ptr<uchar>(i); for (int j = 0; j < col; ++j) { uchar b = s[3 * j]; uchar g = s[3 * j + 1]; uchar r = s[3 * j + 2]; int newb, newg, newr; if (alpha == 1) { t[3 * j + 2] = r > thresh ? 255 : 0; t[3 * j + 1] = g > thresh ? 255 : 0; t[3 * j] = b > thresh ? 255 : 0; continue; } else if (alpha >= 0) { newr = static_cast<int>(thresh + (r - thresh) / (1 - alpha)); newg = static_cast<int>(thresh + (g - thresh) / (1 - alpha)); newb = static_cast<int>(thresh + (b - thresh) / (1 - alpha)); } else { newr = static_cast<int>(thresh + (r - thresh) * (1 + alpha)); newg = static_cast<int>(thresh + (g - thresh) * (1 + alpha)); newb = static_cast<int>(thresh + (b - thresh) * (1 + alpha)); } newr = max(0, min(255, newr)); newg = max(0, min(255, newg)); newb = max(0, min(255, newb)); t[3 * j + 2] = static_cast<uchar>(newr); t[3 * j + 1] = static_cast<uchar>(newg); t[3 * j] = static_cast<uchar>(newb); } } return temp; }
測(cè)試效果
圖1 原圖
圖2 參數(shù)為50的效果圖
圖3 參數(shù)為-50的效果圖
通過(guò)調(diào)整percent可以實(shí)現(xiàn)圖像對(duì)比度的調(diào)整。
到此這篇關(guān)于OpenCV 圖像對(duì)比度的實(shí)踐的文章就介紹到這了,更多相關(guān)OpenCV 圖像對(duì)比度內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于pytorch訓(xùn)練分類(lèi)器
這篇文章主要介紹了關(guān)于pytorch訓(xùn)練分類(lèi)器問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09利用Python將時(shí)間或時(shí)間間隔轉(zhuǎn)為ISO 8601格式方法示例
國(guó)際標(biāo)準(zhǔn)化組織的國(guó)際標(biāo)準(zhǔn)ISO8601是日期和時(shí)間的表示方法,全稱(chēng)為《數(shù)據(jù)存儲(chǔ)和交換形式·信息交換·日期和時(shí)間的表示方法》,下面這篇文章主要給大家介紹了關(guān)于利用Python將時(shí)間或時(shí)間間隔轉(zhuǎn)為ISO 8601格式的相關(guān)資料,需要的朋友可以參考下。2017-09-09python批量修改xml屬性的實(shí)現(xiàn)方式
這篇文章主要介紹了python批量修改xml屬性的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03python 字符串轉(zhuǎn)列表 list 出現(xiàn)\ufeff的解決方法
下面小編就為大家?guī)?lái)一篇python 字符串轉(zhuǎn)列表 list 出現(xiàn)\ufeff的解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06Python+OpenCV+pyQt5錄制雙目攝像頭視頻的實(shí)例
今天小編就為大家分享一篇Python+OpenCV+pyQt5錄制雙目攝像頭視頻的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06python中協(xié)程實(shí)現(xiàn)TCP連接的實(shí)例分析
在本篇文章中我們給大家分享了python中協(xié)程實(shí)現(xiàn)TCP連接的代碼示例內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)下。2018-10-10使用Python進(jìn)行同期群分析(Cohort?Analysis)
同期群(Cohort)的字面意思(有共同特點(diǎn)或舉止類(lèi)同的)一群人,比如不同性別,不同年齡。這篇文章主要介紹了用Python語(yǔ)言來(lái)進(jìn)行同期群分析,感興趣的同學(xué)可以閱讀參考一下本文2023-03-03