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()中开始提出新问题 如何使用
发生这种情况是因为红色是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)
| 归档时间: |
|
| 查看次数: |
3629 次 |
| 最近记录: |