1. 程式人生 > >“毛星雲OpenCV3程式設計入門之python實現”第八篇亮度、對比度

“毛星雲OpenCV3程式設計入門之python實現”第八篇亮度、對比度

5.4亮度、對比度

python程式碼:

# -*- coding: utf-8 -*-

import cv2
import numpy as np

gcontrastvalue = 80      # 對比度
gbrightvalue = 80        # 亮度


def contrast(contrastvalue):
	desImage = srcImage.copy()
	global gcontrastvalue
	global gbrightvalue
	print('gcontrastvalue:', gcontrastvalue)
	print('gbrightvalue:'
, gbrightvalue) table = [] for i in range(256): data = int(i * gcontrastvalue * 0.01 + gbrightvalue) if data < 0: table.append(0) elif data > 255: table.append(255) else: table.append(data) table = np.array(table, dtype=np.uint8) # 將陣列轉換為對映矩陣,資料型別與原影象資料保持一致 cv2.LUT(srcImage, table,
desImage) # 利用系統函式LUT進行對映矩陣替換原圖形資料 cv2.imshow("window1", desImage) gcontrastvalue = contrastvalue def bright(brightvalue): desImage = srcImage.copy() global gcontrastvalue global gbrightvalue print('gcontrastvalue:', gcontrastvalue) print('gbrightvalue:', gbrightvalue) table = [] for i in
range(256): data = int(i * gcontrastvalue * 0.01 + gbrightvalue) if data < 0: table.append(0) elif data > 255: table.append(255) else: table.append(data) table = np.array(table, dtype=np.uint8) # 將陣列轉換為對映矩陣,資料型別與原影象資料保持一致 cv2.LUT(srcImage, table, desImage) # 利用系統函式LUT進行對映矩陣替換原圖形資料 cv2.imshow("window1", desImage) gbrightvalue = brightvalue srcImage = cv2.imread("E:/Study/python/OpenCV_study/img/8.jpg") # print(srcImage.shape) # 獲取原影象的尺寸 # print(type(srcImage[0][0][0])) # 獲取原影象的資料型別,為後面做對映矩陣服務 cv2.namedWindow("window1") cv2.createTrackbar("對比度", "window1", 80, 300, contrast) cv2.createTrackbar("亮 度", "window1", 80, 100, bright) cv2.imshow("window1", srcImage) cv2.waitKey(0)

原書中的C++程式碼:



//--------------------------------------【程式說明】-------------------------------------------
//		程式說明:《OpenCV3程式設計入門》OpenCV3版書本配套示例程式27
//		程式描述:影象對比度、亮度值調整
//		開發測試所用IDE版本:Visual Studio 2010
//		開發測試所用OpenCV版本:	3.0 beta
//		2014年11月 Created by @淺墨_毛星雲
//		2014年12月 Revised by @淺墨_毛星雲
//------------------------------------------------------------------------------------------------



//-----------------------------------【標頭檔案包含部分】---------------------------------------
//	描述:包含程式所依賴的標頭檔案
//---------------------------------------------------------------------------------------------- 
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>

//-----------------------------------【名稱空間宣告部分】---------------------------------------
//	描述:包含程式所使用的名稱空間
//-----------------------------------------------------------------------------------------------   
using namespace std;
using namespace cv;


//-----------------------------------【全域性函式宣告部分】--------------------------------------
//	描述:全域性函式宣告
//-----------------------------------------------------------------------------------------------
static void ContrastAndBright(int, void *);
void   ShowHelpText();

//-----------------------------------【全域性變數宣告部分】--------------------------------------
//	描述:全域性變數宣告
//-----------------------------------------------------------------------------------------------
int g_nContrastValue; //對比度值
int g_nBrightValue;  //亮度值
Mat g_srcImage,g_dstImage;
//-----------------------------------【main( )函式】--------------------------------------------
//	描述:控制檯應用程式的入口函式,我們的程式從這裡開始
//-----------------------------------------------------------------------------------------------
int main(   )
{
	//改變控制檯前景色和背景色
	system("color 2F");  

	ShowHelpText();
	// 讀入使用者提供的影象
	g_srcImage = imread( "1.jpg");
	if( !g_srcImage.data ) { printf("讀取g_srcImage圖片錯誤~! \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);

	//輸出一些幫助資訊
	cout<<endl<<"\t執行成功,請調整滾動條觀察影象效果\n\n"
		<<"\t按下“q”鍵時,程式退出\n";

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




//-----------------------------------【ShowHelpText( )函式】----------------------------------
//		 描述:輸出一些幫助資訊
//----------------------------------------------------------------------------------------------
void ShowHelpText()
{
	//輸出歡迎資訊和OpenCV版本
	printf("\n\n\t\t\t非常感謝購買《OpenCV3程式設計入門》一書!\n");
	printf("\n\n\t\t\t此為本書OpenCV3版的第27個配套示例程式\n");
	printf("\n\n\t\t\t   當前使用的OpenCV版本為:" CV_VERSION );
	printf("\n\n  ----------------------------------------------------------------------------\n");
}


//-----------------------------【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);
}