opencv學習之-----圖像對比度、亮度值調整

在圖像像素公式g(x)=a*f(x)+b其中:

  • 參數f(x)表示源圖像像素。
  • 參數g(x) 表示輸出圖像像素。
  • 參數a(需要滿足a>0)被稱爲增益(gain),常常被用來控制圖像的對比度。
  • 參數b通常被稱爲偏置(bias),常常被用來控制圖像的亮度。

爲了訪問圖像的每一個像素,我們使用這樣的語法: image.at<Vec3b>(y,x)[c]

其中,y是像素所在的行, x是像素所在的列, c是R、G、B(對應0、1、2)其中之一。

因爲我們的運算結果可能超出像素取值範圍(溢出),還可能是非整數(如果是浮點數的話),所以我們要用saturate_cast對結果進行轉換,以確保它爲有效值。

這裏的a也就是對比度,一般爲了觀察的效果,取值爲0.0到3.0的浮點值,但是我們的軌跡條一般取值都會整數,所以在這裏我們可以,將其代表對比度值的nContrastValue參數設爲0到300之間的整型,在最後的式子中乘以一個0.01,這樣就可以完成軌跡條中300個不同取值的變化。所以在式子中,我們會看到saturate_cast<uchar>( (g_nContrastValue*0.01)*(image.at<Vec3b>(y,x)[c] ) + g_nBrightValue )中的g_nContrastValue*0.01。

程序示例如下:


#include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include"opencv2/imgproc/imgproc.hpp"
#include <iostream>

using namespace cv;


static void ContrastAndBright(int, void *);

int g_nContrastValue; //對比度值
int g_nBrightValue;  //亮度值
Mat g_srcImage, g_dstImage;
//-----------------------------------【main( )函數】--------------------------------------------
//     描述:控制檯應用程序的入口函數,我們的程序從這裏開始
//-----------------------------------------------------------------------------------------------
int main()
{
	//改變控制檯前景色和背景色
	system("color5F");

	//讀入用戶提供的圖像
	g_srcImage = imread("8.jpg");
	if (!g_srcImage.data) { printf("讀取圖片失敗!\n"); return false; }
	g_dstImage = Mat::zeros(g_srcImage.size(), g_srcImage.type());

	//設定對比度和亮度的初值
	g_nContrastValue = 80;
	g_nBrightValue = 80;

	//創建窗口
	namedWindow("結果", 1);

	//創建軌跡條
	createTrackbar("對比度:", "結果", &g_nContrastValue, 300, ContrastAndBright);
	createTrackbar("亮   度:", "結果", &g_nBrightValue, 200, ContrastAndBright);

	//調用回調函數
	ContrastAndBright(g_nContrastValue, 0);
	ContrastAndBright(g_nBrightValue, 0);

	//按下“q”鍵時,程序退出
	while (char(waitKey(1)) != 'q') {}
	return 0;
}


//-----------------------------【ContrastAndBright( )函數】------------------------------------
//     描述:改變圖像對比度和亮度值的回調函數
//-----------------------------------------------------------------------------------------------
static void ContrastAndBright(int, void *)
{

	//創建窗口
	namedWindow("原圖", 1);

	//三個for循環,執行運算 g_dstImage(i,j) =a*g_srcImage(i,j) + b
	for (int y = 0; y < g_srcImage.rows; y++)
	{
		for (int x = 0; x < g_srcImage.cols; x++)
		{
			for (int c = 0; c < 3; c++)
			{
				g_dstImage.at<Vec3b>(y, x)[c] = saturate_cast<uchar>((g_nContrastValue*0.01)*(g_srcImage.at<Vec3b>(y, x)[c]) + g_nBrightValue);
			}
		}
	}

	//顯示圖像
	imshow("原圖", g_srcImage);
	imshow("結果", g_dstImage);
}

運行結果:

 

參考: 
本系列文章是學習下列文章的筆記。 

@淺墨_毛星雲 出品,轉載請註明出處。  

文章鏈接: http://blog.csdn.net/poem_qianmo/article/details/21479533

作者:毛星雲(淺墨)    郵箱: [email protected] 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章