您好,登錄后才能下訂單哦!
這篇文章主要介紹了OpenCV在圖像對比度的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
圖像對比度指的是一幅圖像中明暗區域最亮的白和最暗的黑之間不同亮度層級的測量,即指一幅圖像灰度反差的大小。差異范圍越大代表對比越大,差異范圍越小代表對比越小。設置一個基準值thresh,當percent大于0時,需要令圖像中的顏色對比更強烈,即數值距離thresh越遠,則變化越大;當percent等于1時,對比強到極致,只有255和0的區分;當percent等于0時,不變;當percent小于0時,對比下降,即令遠離thresh的數值更近些;當percent等于-1時,沒有對比了,全是thresh值。
對比度調整算法的實現流程如下:
1.設置調整參數percent,取值為-100到100,類似PS中設置,歸一化后為-1到1。
2.針對圖像所有像素點單個處理。當percent大于等于0時,對比增強,調整后的RGB三通道數值為:
3.若percent小于0時,對比降低,此時調整后的圖像RGB三通道值為:
4.若percent等于1時,大于thresh則等于255,小于則等于0。
至此,圖像實現了明度的調整,算法邏輯參考xingyanxiao。C++實現代碼如下。
功能函數代碼
// 對比度 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++測試代碼
#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; } // 對比度 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; }
圖1 原圖
圖2 參數為50的效果圖
圖3 參數為-50的效果圖
通過調整percent可以實現圖像對比度的調整。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“OpenCV在圖像對比度的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。