OpenCV RGB单通道颜色调节

use*_*318 5 python opencv colors adjustment

输入A图像是完整的RGB图像,输出B图像是相同的图像但具有"调整的"R值

我需要将RGB值重新缩放到128到255之间,以便将小于128的次要值缩放到较高的值.

RMAX = 127

img = cv2.imread(filename)         # load img
blue, green, red = cv2.split(img)  # get single color

red = red*RMAX/255+128             # scale the color as I need 
Run Code Online (Sandbox Code Playgroud)

但这继续得到错误的价值:

如果红色值为255 = 255*127/255 + 128应输出255但返回128

为什么会这样?

编辑:

每次都不需要重新计算颜色值,最好在开始时使用值范围准备数组,然后用数组中的值替换当前值?

ValuesForRed = [0]*255

for i in range(0,255):
    ValuesForRed[i]=i*127 / 255 + 128
Run Code Online (Sandbox Code Playgroud)

如何替换数组中的值现在是问题...

应该用相应的索引替换相应的值

i.e. red[45]= 0 
     ValuesForRed[0] = 128
     red[45]= 128
Run Code Online (Sandbox Code Playgroud)

Python Opencv cv2.LUT()中开始提出新问题 如何使用

Ale*_*xey 5

发生这种情况是因为红色是unsigned char0到255范围内的数字.但是,您希望red行为像整数.

所以考虑到了

red = 255
red = red*127/255 + 128
Run Code Online (Sandbox Code Playgroud)

当程序乘以红色*127时,结果将溢出,因为它的值将大于255,因此答案将是0(因为255*127模255 = 0).因此,你得到red = red*127/255 + 128 = (255*127 modulo 255) / 255 + 128 = 0 /255 + 128 = 128

要解决此问题,您可以red在对其执行算术运算时强制转换为float,例如:

red = (float)red * 127 / 255
Run Code Online (Sandbox Code Playgroud)

编辑 正如指出的威廉red是一个cv::Mat类型的CV_8U.您可以将图像转换为CV_32F类型进行计算,然后将其转换回来.例如(这是C++代码):

 Mat red_float;   
 red.convertTo(red_float,CV_32F);
 red_float = red_float*RMAX/255+128;
 red_float.convertTo(red,CV_8U);
Run Code Online (Sandbox Code Playgroud)