一、前言
上一篇我們講解了OpenCV的圖像混合與ROI。本篇主要向大家介紹下圖像變換的調(diào)整亮度和對比度。按慣例,先來一張效果圖。

魔鎧變身
二、圖像變換
算子
一般的圖像處理算子都是一個(gè)函數(shù),它接受一個(gè)或多個(gè)輸入圖像,并產(chǎn)生輸出圖像。
單輸入
g(x) = h(f(x))
多輸入
g(x) = h(f0(x)......fn(x))
根據(jù)算子的不同,圖像變換分為兩大類:
- 像素變換 - 點(diǎn)操作
- 鄰域操作 - 區(qū)域
像素變換
這類變換操作的是點(diǎn)。根據(jù)輸入像素值(有時(shí)可加上某些全局信息或參數(shù))計(jì)算相應(yīng)的輸出像素值。
這類算子包括亮度和對比度調(diào)整 ,以及顏色校正和變換。
鄰域操作
這類變換操作的是區(qū)域(大塊的,非點(diǎn)操作)。
這類算子包括卷積、特征提取、梯度計(jì)算、模糊等。
后續(xù)文章中我們將一一講解,這里不再贅述。
三、調(diào)整圖像亮度和對比度
g(i, j) = αf(i,j) + β 其中α>0,β是增益變量
- f(i,j) 表示源圖像像素
- g(i,j) 表示輸出圖像像素
一些理解
亮度越亮其實(shí)看起來越“白”,在圖像處理中就是像素值越靠近255。β變量是個(gè)增益變量,β越大,像素值就越靠近255,自然就提高了亮度。所以,β常常被用來控制圖像的亮度。
α對像素的操作是乘法,乘法會(huì)”擴(kuò)大差距“,打個(gè)比方:1x10 = 10, 2x10 = 20。改變?chǔ)習(xí)⑾袼刂档牟罹鄶U(kuò)大,也就是改變了對比度。所以,α常常被用來控制圖像的對比度。
魔鎧變身

魔鎧變身
+(UIImage *)transform:(UIImage *)image alpha:(double)alpha beta:(double)beta {
Mat src;
UIImageToMat(image, src);
Mat dst = Mat(src.size(), src.type());
int rows = src.rows;
int cols = src.cols;
Mat m;
src.convertTo(m, CV_32F);
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
if(src.channels() == 1) {//單通道
float v = m.at<Vec3f>(row, col)[0];
dst.at<uchar>(row, col) = saturate_cast<uchar>(v*alpha + beta);
} else if (src.channels() == 3) { //3通道
for (int i=0; i< src.channels(); i++) {
float v = m.at<Vec3f>(row, col)[i];
dst.at<Vec3b>(row, col)[i] = saturate_cast<uchar>(v*alpha + beta);
}
} else if (src.channels() == 4) { //4通道
for (int i=0; i< src.channels(); i++) {
float v = m.at<Vec4f>(row, col)[i];
dst.at<Vec4b>(row, col)[i] = saturate_cast<uchar>(v*alpha + beta);
}
}
}
}
UIImage* result = MatToUIImage(dst);
return result;
}
注:
- 做像素點(diǎn)操作時(shí)應(yīng)當(dāng)注意數(shù)據(jù)類型的轉(zhuǎn)換
src.convertTo(m, CV_32F);
- 圖像的通道多樣,處理圖片時(shí)需要做多通道的處理
if(src.channels() == 1) {//單通道
...
} else if (src.channels() == 3) { //3通道
...
} else if (src.channels() == 4) { //4通道
...
}
四、小結(jié)
本篇主要介紹了圖像變換的概念,并通過例子講解了亮度和對比度的調(diào)整。本篇的內(nèi)容相對簡單,但是對像素點(diǎn)的操作是基本功,特別是在實(shí)現(xiàn)自定義算法時(shí),需要好好掌握。在今后的學(xué)習(xí)中亮度和對比度的調(diào)整是很多圖像處理的前期工作,也需要理解透徹。今天就到這了,有疑問的朋友可以給我留言,see you later!