影象處理之亮度與對比度
阿新 • • 發佈:2019-02-15
處理影象經常會對影象色彩進行增強,這就是改變影象的亮度和對比度。本章基於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; }