输入 图像是完整的 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() 如何使用
这是因为红色是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
编辑正如威廉·red
所指出的,是CV_8U
型cv::Mat
。您可以将图像转换为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);
OP的另一个问题是"如何最好地解决这个问题?这就是我的做法。这是C++代码,但您应该能够轻松地将其转换为Python。这种方法速度很快,无需将矩阵转换为CV_32F
类型。
-
将输入图像拆分为通道
Mat input_image; //input image vector<Mat> split_image(3); split(input_image, split_image); Mat red = split_image[2];
-
获取
mask_red
,这样,如果mask_red
中的相应位置介于 129 和 255(包含边界)之间,则red
中的位置设置为 255,否则设置为 0。这可以通过inRange()
功能来实现。Mat mask_red; inRange(red, Scalar(129), Scalar(255), mask_red);
-
现在
setTo()
函数应用于red
,将所有蒙版像素设置为 255。red.setTo(Scalar(255), mask_red);
-
合并通道以形成最终图像。
Mat output_image; // output image merge(split_image, output_image);