日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

提升图像对比度和亮度

發(fā)布時間:2024/9/5 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 提升图像对比度和亮度 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 一 提升圖像對比度和亮度
  • 二 代碼實現(xiàn)
  • 三 實現(xiàn)效果

注:原創(chuàng)不易,轉(zhuǎn)載請務必注明原作者和出處,感謝支持!

一 提升圖像對比度和亮度

一般來說圖像的變換可以分成以下兩類:
(1)像素變換
在像素變換中,僅僅根據(jù)輸入的像素值(有時可能加上某些全局信息或者參數(shù))來計算相應的輸出像素值。該類變換的常見方法有亮度和對比度調(diào)整、顏色校正和顏色變換等等。該類變換可以用下面的通用變換公式來表示。\(f(x,y)\)表示原圖像\((x,y)\)處的像素值,\(T\)表示變換函數(shù),\(g(x,y)\)表示輸出圖像\((x,y)\)處的像素值。可以看到輸入僅有當個位置的像素值。
\[ g(x, y) = T[f(x, y)] \]

(2)鄰域變換
在鄰域變換中,變換函數(shù)的輸入可以是多個像素所構(gòu)成的一個鄰域,然后根據(jù)變換函數(shù)計算相應的像素值輸出。鄰域變換最常見的方法有圖像卷積操作。對于圖像卷積,假設(shè)中心錨點位置為\((x,y)\),濾波器大小為\(m \times n\),且\(m\)\(n\)均為奇數(shù)(濾波器大小一般均為奇數(shù))。令\(a = (m-1)/2\)\(b = (n-1)/2\),矩陣\(w\)為濾波器系數(shù),原圖像為\(f\),輸出圖像為\(g\),則圖像的卷積操作可以用下面的通用公式表示。
\[ g(x,y) = \sum_{s=-a}^a \sum_{t=-b}^b w(s,t)f(x+s, y+t) \]

而提升圖像對比度和亮度是一個典型的像素變換操作,它的變換公式表示如下。如果你想要提升圖像亮度(針對灰度圖),那你只需要令\(\alpha = 1\),并使\(\beta\)的值大于0,使圖像的亮度得到一個增益即可。此時,圖像的每個像素都將提升\(\beta\)個灰度值。如果你想要提升圖像對比度,那你只需要令\(\beta = 0\),并使\(\alpha\)的值大于1,使得圖像相鄰像素差值變大從而提升圖像的對比度。如果你既要提升對比度和亮度,則只需要選擇\(\alpha\)為大于1的合適值和\(\beta\)為大于0的合適值即可。
\[ g(x,y) = \alpha f(x, y) + \beta \]


二 代碼實現(xiàn)

OpenCV中提供了一個實現(xiàn)提升圖像對比度和亮度的APIconvertTo()如下。

void cv::Mat::convertTo(OutputArray m, // 輸出圖像int rtype, // 輸出圖像類型,取-1則表示類型與原圖相同double alpha = 1, // alpha值double beta = 0 // beta值 ) const;

如果不使用convertTo(),則可以將手寫代碼實現(xiàn)如下。

#include <iostream> #include <opencv2/opencv.hpp>using namespace cv; using namespace std;int main(int argc, char **argv) {// load source image and show itMat src = imread("D:\\IMG\\lena.jpg", IMREAD_UNCHANGED);if (!src.data){cout << "Error : could not load image." << endl;return -1;}imshow("input", src);// parameters for enhance contrastdouble alpha = 2.0;double beta = 0.0;Mat dst(src.size(), src.type());decltype(src.rows) row, col;for (row = 0; row < src.rows; ++row){for (col = 0; col < src.cols; ++col){// single channel (gray image) or three channels (BGR image) onlyif (src.channels() == 1){int gray = src.at<uchar>(row, col);dst.at<uchar>(row, col) = saturate_cast<uchar>(gray * alpha + beta);}else if (src.channels() == 3){int b = src.at<Vec3b>(row, col)[0];int g = src.at<Vec3b>(row, col)[1];int r = src.at<Vec3b>(row, col)[2];dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b * alpha + beta);dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g * alpha + beta);dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r * alpha + beta);}}}imshow("output (alpha = 2)", dst);waitKey(0);return 0; }

如果使用APIconvertTo(),則可以簡單地作如下實現(xiàn)。

src.convertTo(dst, -1, alpha, beta);

三 實現(xiàn)效果

(1) 單純提升亮度
原圖

手寫代碼實現(xiàn),\(\beta\)分別為50、100、150

調(diào)用API實現(xiàn),\(\beta\)分別為50、100、150

(2) 單純提升對比度
原圖

手寫代碼實現(xiàn),\(\alpha\)分別為2、3、4

調(diào)用API實現(xiàn),\(\alpha\)分別為2、3、4

(3) 同時提升對比度和亮度,\(\alpha = 3\)\(\beta = 50\)

可以看到,手寫代碼實現(xiàn)的效果與調(diào)用API實現(xiàn)的效果略有不同,但大體效果是不差多少的。在熟悉了API實現(xiàn)原理之后,以后就可以直接調(diào)用API進行實現(xiàn)而無需自己手動寫代碼實現(xiàn)。

轉(zhuǎn)載于:https://www.cnblogs.com/laizhenghong2012/p/11254079.html

總結(jié)

以上是生活随笔為你收集整理的提升图像对比度和亮度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。