OpenCV色调曲线progrommatically

我想要实现像色调曲线那样的水平。

我有预定义的一组曲线,我应该适用于图像。 例如: 在这里输入图像说明

就我所知,在这个图表中,我们看到当前色调值与新的依赖关系,例如:如果我们得到左边的第一个点 – 每个r,g和b = 0将被转换为64或每个大于224的值将是转换为0等。

所以我试图改变图像的每个像素到新的价值

为了testing目的,我简化了曲线:

在这里输入图像说明

这里的代码我有:

//init original image cv::Mat originalMat = [self cvMatFromUIImage:inputImage]; //out image the same size cv::Mat outMat = [self cvMatFromUIImage:inputImage]; //loop throw every row of image for( int y = 0; y < originalMat.rows; y++ ){ //loop throw every column of image for( int x = 0; x < originalMat.cols; x++ ){ //loop throw every color channel of image (R,G,B) for( int c = 0; c < 3; c++ ){ if(originalMat.at<cv::Vec3b>(y,x)[c] <= 64) outMat.at<cv::Vec3b>(y,x)[c] = 64 + ( originalMat.at<cv::Vec3b>(y,x)[c] ) - ( originalMat.at<cv::Vec3b>(y,x)[c] ) * 2 ; if((originalMat.at<cv::Vec3b>(y,x)[c] > 64)&&(originalMat.at<cv::Vec3b>(y,x)[c] <= 128)) outMat.at<cv::Vec3b>(y,x)[c] = (( originalMat.at<cv::Vec3b>(y,x)[c] ) - 64 ) * 4 ; if((originalMat.at<cv::Vec3b>(y,x)[c] > 128)) outMat.at<cv::Vec3b>(y,x)[c] = ( originalMat.at<cv::Vec3b>(y,x)[c] ) + 128 - (( originalMat.at<cv::Vec3b>(y,x)[c] ) - 128) * 3; } //end of r,g,b loop } //end of column loop } //end of row loop //send to output return [self UIImageFromCVMat:outMat]; 

但在这里得到的结果是: 在这里输入图像说明

由于某种原因,只有3/4的图像被处理

它不符合我预期的结果: 在这里输入图像说明

更新0

感谢@ACCurrent评论发现计算错误(代码和图片更新),但仍然不明白为什么只有3/4的image processing。

不知道为什么“噪音”出现,希望因为曲线不平滑。

看起来是避免运作的方法。

更新1

原始图像:

在这里输入图像说明

您需要使用Vec4b访问图像


originalMat.type()等于24

您的originalMat是24型,即CV_8UC4 。 这意味着图像有4个通道,但是您使用Vec3b访问它,就好像它只有3个通道一样。 这解释了为什么约1/4的图像没有被修改。

所以,只需用Vec3breplace代码中的每个Vec3b Vec4b