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介绍就到此完毕,后面有相关再补充,写文章不容易,还请点个**小星星**传送门

相关文章
相关标签/搜索