iOS使用OpenCV之調整圖片亮度和對比度(一)

前言

  • 本文介紹使用OpenCV之調整圖片亮度和對比度

理論

圖像變換能夠看做以下:
1)像素變換 – 點操做,用在調整圖像亮度和對比度等操做上
2)鄰域操做 – 區域,用在圖像卷積、特徵提取、梯度計算、模式匹配識別、角點檢測、模糊、平滑等操做上
調整圖像亮度和對比度屬於像素變換 - 點操做
g(i,j) = αf(i,j) + β
兩個參數αβ稱做增益和偏置參數,用這兩個參數來分別控制對比度和亮度c++

核心思路

一、將UIImage轉換爲C++圖片
二、4通道轉3通道
三、建立一張跟原圖像大小和類型一致的空白圖像dst = Mat::zeros(src.size(), src.type())
四、for循環繪製輸出圖saturate_cast(value)確保值大小範圍爲0~255之間
五、將c++圖片轉換爲UIImagegit

代碼演示

這裏有一點須要注意的就是,須要將4通道圖片轉換爲3通道,github

/* 4通道轉成3通道 */
NS_INLINE cv::Mat kFourChannelsBecomeThree(const cv::Mat src){
    Mat dst;
    if (src.channels() == 4) {
        cv::cvtColor(src, dst, COLOR_RGBA2RGB);
        return dst;
    }
    return src;
}
複製代碼

若是不轉換的話,獲得的圖片顯示不徹底算法

/* 調整圖片亮度和對比度,contrast[0-100],luminance[0-2] */
- (UIImage*)kj_opencvChangeContrast:(int)contrast luminance:(double)luminance{
    cv::Mat src,dst;
    UIImageToMat(self,src,true);
    src = kFourChannelsBecomeThree(src);
    dst = Mat::zeros(src.size(), src.type());
    int channels = src.channels();
    for (int i = 0; i < src.rows; i++) {
        for (int j = 0; j < src.cols; j++) {
            if (channels == 3) {//rgb
                dst.at<Vec3b>(i, j)[0] = saturate_cast<uchar>(src.at<Vec3b>(i, j)[0] * luminance + contrast);
                dst.at<Vec3b>(i, j)[1] = saturate_cast<uchar>(src.at<Vec3b>(i, j)[1] * luminance + contrast);
                dst.at<Vec3b>(i, j)[2] = saturate_cast<uchar>(src.at<Vec3b>(i, j)[2] * luminance + contrast);
            }else if (channels == 1) {//gray
                dst.at<uchar>(i, j) = saturate_cast<uchar>(src.at<uchar>(i, j) * luminance + contrast);
            }
        }
    }
    return kMatToUIImage(dst);
}
複製代碼

效果圖

上圖爲原圖 markdown

系列文章關聯

一、如何在 iOS 工程中使用 OpenCV
二、iOS使用OpenCV之調整圖片亮度和對比度(一)
三、iOS使用OpenCV之圖像融合(二)
四、iOS使用OpenCV之濾波處理(三)oop

接下來我會慢慢補充Opencv的相關文章,暫時已將常見的圖片處理和圖片算法封裝出來,有須要的朋友能夠去pod 'KJExtensionHandler/Opencv'post

如何在 iOS 工程中使用 OpenCV介紹就到此完畢,後面有相關再補充,寫文章不容易,還請點個**小星星**傳送門

相關文章
相關標籤/搜索