“毛星雲OpenCV3程式設計入門之python實現”第八篇亮度、對比度
阿新 • • 發佈:2018-12-14
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);
}