1. 程式人生 > >影象處理之亮度與對比度

影象處理之亮度與對比度

處理影象經常會對影象色彩進行增強,這就是改變影象的亮度和對比度。本章基於opencv對影象的亮度和對比度進行處理操作。其實,這是對影象的每一個畫素點進行相應的操作。


上面這個公式可以很好的解釋對影象的亮度和對比度操作的原理,第一個引數α必須是大於零,不然則基本上沒有意義了。α能代表什麼呢?α能使影象畫素成倍數的增長或降低(α<1),改變了是影象的對比度,因為使影象的差值變化了。那麼β作何解釋呢?β可為負,也可為正,那麼任何一個畫素都在(0, 255)之間,加上一個值或減去一個值則會使這個畫素點變大或變小,其實就是向白色或向黑色靠近(0為黑,255為白),所以改變的是影象的亮度。

接下來我們用程式碼演示:

(一)基於Python語言——演示灰色影象的比色度和反差

import cv2
import matplotlib.pyplot as plt
# 反差與對比度
input_image = cv2.imread("Peppers.jpg")
output_gray = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)
output_min_gray = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)
output_max_gray = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)
# 反差影象,cv2.bitwise_not()函式相當於用255減去每一個畫素。
output_contrast_image = cv2.bitwise_not(input_image)
for i in xrange(input_image.shape[0]):
    for j in xrange(input_image.shape[1]):
        b = input_image[i, j, 0]
        g = input_image[i, j, 1]
        r = input_image[i, j, 2]
        output_min_gray[i, j] = min(b, min(g, r))
        output_max_gray[i, j] = max(b, min(g, r))

output_image = [output_gray, output_min_gray, output_max_gray, output_contrast_image]
output_titles = ["output_gray", "output_min_gray", "output_max_gray", "output_contrast_image"]
for i in xrange(4):
    plt.subplot(2, 2, (i+1))
    plt.imshow(output_image[i], "gray")
    plt.title(output_titles[i])
    plt.xticks([]), plt.yticks([])
plt.savefig("contrast_gray")


(二)基於C++語言——演示影象的亮度

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;

int main(int argc, char* argv) {
	Mat src, dst;
	src = imread("test.jpg");
	if (src.empty()) {
		printf("Could not load image...\n");
		return -1;
	}
	char input_win[] = "input image";
	namedWindow(input_win, CV_WINDOW_AUTOSIZE);
	imshow("input window", src);

	int height = src.rows;
	int width = src.cols;
	dst = Mat::zeros(src.size(), src.type());
        float alpha = 0.8;
	float beta = -20;
	for (int row = 0; row < height; row++) {
		for (int col = 0; col < width; col++) {
			
			float b = src.at<Vec3b>(row, col)[0];
			float g = src.at<Vec3b>(row, col)[1];
			float r = src.at<Vec3b>(row, col)[2];
			// saturate_cast 函式確保畫素值在0到255之間。
			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);
			
		}
	}
	char output_title[] = "contrast and brightness change demo";
	namedWindow(output_title, CV_WINDOW_AUTOSIZE);
	imshow(output_title, dst);
	
	waitKey(0);
	return 0;
}