人妖和美女做視頻網(wǎng)站如何建立公司網(wǎng)站網(wǎng)頁(yè)
目標(biāo)
- 訪問(wèn)像素值
- 用0來(lái)初始化矩陣
- cv::saturate_cast
- 像素轉(zhuǎn)換
- 提高一張圖像的亮度
原理
圖像處理
圖像變換可以被視作兩個(gè)步驟:
- 點(diǎn)操縱(像素轉(zhuǎn)換)
- 相鄰區(qū)域轉(zhuǎn)換(以面積為基礎(chǔ))
像素轉(zhuǎn)換
- 在這種圖像處理的轉(zhuǎn)換過(guò)程中,每個(gè)輸出的像素的值都取決于相對(duì)應(yīng)的輸入的像素的值。
- 此類(lèi)操作的示例包括亮度和對(duì)比度調(diào)整以及顏色校正和轉(zhuǎn)換。
亮度和對(duì)比度的調(diào)整
- 兩種常用的點(diǎn)處理是帶常數(shù)的乘法和加法:
- 參數(shù)α > 0 和 β 通常被叫做gain和bias參數(shù),該參數(shù)將被用來(lái)控制對(duì)比度和亮度。
- 你可以簡(jiǎn)單地把f(x)當(dāng)作原圖像素,g(x)當(dāng)作輸出圖像的像素,那么我們可以將表達(dá)式寫(xiě)成:
此處的i和j代表像素點(diǎn)的位置,i行j列
源碼
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>// we're NOT "using namespace std;" here, to avoid collisions between the beta variable and std::beta in c++17
using std::cin;
using std::cout;
using std::endl;
using namespace cv;int main( int argc, char** argv )
{
// 加載圖像CommandLineParser parser( argc, argv, "{@input | lena.jpg | input image}" );Mat image = imread( samples::findFile( parser.get<String>( "@input" ) ) );if( image.empty() ){cout << "Could not open or find the image!\n" << endl;cout << "Usage: " << argv[0] << " <Input image>" << endl;return -1;}// 構(gòu)建一個(gè)新的與原圖相同(大小和類(lèi)型)的像素為零的圖像Mat new_image = Mat::zeros( image.size(), image.type() );// 獲取參數(shù) α和βdouble alpha = 1.0; /*< Simple contrast control */int beta = 0; /*< Simple brightness control */cout << " Basic Linear Transforms " << endl;cout << "-------------------------" << endl;cout << "* Enter the alpha value [1.0-3.0]: "; cin >> alpha;cout << "* Enter the beta value [0-100]: "; cin >> beta;// 遍歷圖像,應(yīng)用線(xiàn)性變化// 需注意一個(gè)像素點(diǎn)有三個(gè)通道(B,G,R or 0, 1, 2)for( int y = 0; y < image.rows; y++ ) {for( int x = 0; x < image.cols; x++ ) {for( int c = 0; c < image.channels(); c++ ) {new_image.at<Vec3b>(y,x)[c] =saturate_cast<uchar>( alpha*image.at<Vec3b>(y,x)[c] + beta );}}}imshow("Original Image", image);imshow("New Image", new_image);waitKey();return 0;
}
此外,除了使用上述的for循環(huán)來(lái)遍歷圖片的每一個(gè)像素點(diǎn),我們還可以使用cv::Mat::convertTo來(lái)實(shí)現(xiàn),只是上述代碼用來(lái)更加詳細(xì)的展示其應(yīng)用過(guò)程。
image.convertTo(new_image, -1, alpha, beta);
α和β參數(shù)
伽馬矯正是另一個(gè)用來(lái)矯正圖片亮度的技術(shù)。增加或減少β值將會(huì)為每一個(gè)像素增加或減少一個(gè)固定的常量值。像素值不在[0,255]范圍內(nèi)的將會(huì)被飽和,超過(guò)255的被壓縮到255,小于0的被壓縮到0。
淺灰色為原始圖像的直方圖,Gimp中亮度= 80時(shí)為深灰色。(GIMP(GNU Image Manipulation Program)是一款自由和開(kāi)源的圖像編輯軟件,用于圖像的潤(rùn)色、編輯和制作。)
直方圖表示每個(gè)顏色級(jí)別具有該顏色級(jí)別的像素?cái)?shù)。深色圖像會(huì)有許多低顏色值的像素,因此直方圖會(huì)在其左側(cè)呈現(xiàn)一個(gè)峰值。當(dāng)添加恒定偏差時(shí),直方圖向右移動(dòng),因?yàn)槲覀円呀?jīng)向所有像素添加了恒定偏差。
α參數(shù)將會(huì)修改色階分布的方式。如果α小于1,色階將被壓縮,結(jié)果將是一個(gè)對(duì)比度較低的圖像。
淺灰色為原始圖像的直方圖,Gimp中對(duì)比度< 0時(shí)為深灰色。
請(qǐng)注意,這些直方圖是使用Gimp軟件中的亮度-對(duì)比度工具獲得的。亮度工具應(yīng)該與β偏置參數(shù)相同,但對(duì)比度工具似乎與α增益不同,其中輸出范圍似乎以Gimp為中心(正如您可以在前面的直方圖中注意到的那樣)。
簡(jiǎn)單來(lái)說(shuō),β和亮度相關(guān),但在提高亮度的同時(shí),對(duì)比度也會(huì)降低,圖像會(huì)出現(xiàn)輕微的模糊。α增益可以用來(lái)通過(guò)調(diào)整對(duì)比度減少這種影響,但由于過(guò)于飽和,我們也可能失去一些原來(lái)明亮區(qū)域的細(xì)節(jié)。具體兩個(gè)參數(shù)的值設(shè)置成多少要看具體需求。
伽馬矯正
伽馬矯正可以通過(guò)使用一個(gè)從輸入的值到映射的輸出值的非線(xiàn)性轉(zhuǎn)換來(lái)矯正一個(gè)圖像的亮度。如下所示:
由于聯(lián)系的非線(xiàn)性,對(duì)于所有的像素的影響并不相同,且受限于其的原本的值。
當(dāng)γ<1時(shí),原本的黑暗區(qū)域?qū)?huì)變得更亮,直方圖會(huì)向右平移,代表亮度的提高。這種情況適用于增強(qiáng)圖像中暗處的細(xì)節(jié)。
當(dāng)γ>1時(shí),原本的明亮區(qū)域?qū)?huì)變得更暗,直方圖會(huì)向左平移,代表亮度的減少。這種情況適用于則增強(qiáng)圖像中亮部的細(xì)節(jié)或整體實(shí)現(xiàn)較暗的色調(diào)。
通過(guò)調(diào)整γ值,可以有效地根據(jù)需求來(lái)突出不同的特征。
實(shí)際的例子 link
舉一個(gè)實(shí)際的例子,來(lái)矯正一個(gè)曝光不足的圖片,參數(shù)為α=1.3,β=40
盡管整體亮度得到了提高,但是你仍然可以注意到,丟失了一些信息,比如圖中的云,由于過(guò)度飽和失去了相應(yīng)的細(xì)節(jié)。
當(dāng)我們應(yīng)用伽馬矯正來(lái)進(jìn)行相應(yīng)的圖片矯正,γ=0.4
由于映射是非線(xiàn)性的,并且不像以前的方法那樣可能存在數(shù)值飽和,因此伽馬校正能夠添加較少的飽和效應(yīng),也就是說(shuō)伽馬矯正能夠保留更多的細(xì)節(jié),無(wú)論是原圖中黑暗的區(qū)域還是明亮的區(qū)域。但是具體的γ值需要在使用中去實(shí)踐。
上圖比較了三個(gè)圖像的直方圖(三個(gè)直方圖之間的y范圍不相同)。您可以注意到,大多數(shù)像素值位于原始圖像直方圖的下部。校正后,我們可以在255處觀察到一個(gè)大的峰值,這是由于飽和度以及右邊的偏移。經(jīng)過(guò)伽瑪校正后,直方圖向右偏移,但暗區(qū)像素比亮區(qū)像素偏移更大(見(jiàn)伽瑪曲線(xiàn)圖)。
代碼部分
伽馬矯正的代碼如下:
Mat lookUpTable(1, 256, CV_8U);uchar* p = lookUpTable.ptr();for( int i = 0; i < 256; ++i)p[i] = saturate_cast<uchar>(pow(i / 255.0, gamma_) * 255.0);Mat res = img.clone();LUT(img, lookUpTable, res);
查詢(xún)表被用來(lái)提高計(jì)算性能,伽馬校正(LUT)的計(jì)算通常涉及到對(duì)每個(gè)像素進(jìn)行冪運(yùn)算,而查找表方法只需要預(yù)先計(jì)算出256個(gè)值,然后在實(shí)際處理圖像時(shí)快速查找和應(yīng)用這些預(yù)先計(jì)算的值,從而加快處理速度。
額外資源
- CRT顯示器上的伽瑪校正和圖像
- 圖形渲染中的伽馬矯正
- 數(shù)碼曝光技術(shù)