输入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

但这总是得到错误的值:

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

为什么会这样呢?

编辑:

颜色值不需要每次都重新计算,是否最好在开始时用值的范围准备一个数组,然后用数组中的值替换当前值?
ValuesForRed = [0]*255

for i in range(0,255):
    ValuesForRed[i]=i*127 / 255 + 128

现在,如何替换数组中的值成为问题...

应将相应的值替换为相应的索引
i.e. red[45]= 0
     ValuesForRed[0] = 128
     red[45]= 128

在提出了新问题
Python Opencv cv2.LUT() how to use

最佳答案

发生这种情况是因为红色是unsigned char,它是0到255范围内的数字。但是,您希望red的行为类似于整数。

所以鉴于

red = 255
red = red*127/255 + 128

当程序乘以red * 127时,结果将溢出,因为其值将大于255,因此答案将是0(因为255 * 127以255为模数= 0)。因此,您得到red = red*127/255 + 128 = (255*127 modulo 255) / 255 + 128 = 0 /255 + 128 = 128
要解决此问题,可以在对它执行算术运算时将red强制转换为浮点型,例如:
red = (float)red * 127 / 255

编辑
正如William所指出的,redcv::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);

关于python - OpenCV RGB单 channel 色彩调节,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21094055/

10-12 23:09