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的图像没有被修改。
所以,只需用Vec3b
replace代码中的每个Vec3b
Vec4b
。