Learning OpenCV with iOS:圖像亮度和對比度

一、前言

上一篇我們講解了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!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容