我和他有同样的问题:Scaling a matrix in OpenCV
我和他有同样的问题,我有彩色图片,我用matlab来读取图片:Input = imread('input1.jpg');
,图片的格式是612x612x3 uint8,我在图片中打印5x5x1像素下面:Input(1:5,1:5,1)
201 201 201 201 201
201 201 201 201 201
202 202 202 202 202
203 203 203 203 203
204 204 204 204 204
使用mat2gray函数:rgb_out = mat2gray(Input);
,这些像素可以转换为此,它们都在0到1之间的范围内:rgb_out(1:5,1:5,1)
0.9684 0.9455 0.9266 0.9099 0.9047
0.9657 0.9542 0.9432 0.9354 0.9299
0.9642 0.9571 0.9502 0.9495 0.9456
0.9621 0.9609 0.9562 0.9532 0.9516
0.9673 0.9633 0.9597 0.9580 0.9575
所以问题是我如何在Opencv中用Python实现它,我尝试了如下代码:
print(Input)
rgb_out = np.zeros(Input.shape, np.uint8)
cv2.normalize(Input,rgb_out,1,0,cv2.NORM_MINMAX)
print(rgb_out)
但第一张照片是:
[[[205 207 201]
[205 207 201]
[205 207 201]
...,
[232 254 242]
[232 254 242]
[231 253 241]]...
并且rgb_out中的元素不超过1或0.请帮助,谢谢。
答案 0 :(得分:3)
您的输入矩阵是整数数据类型,输出矩阵定义为np.uint8
(整数类型)。默认情况下,cv2.normalize
将返回与输入数据类型相同的结果。如果您希望输出值在0.0
和1.0
之间,则您将要使用浮点数据类型。
一种选择是在调用np.double
之前将输入和输出转换为cv2.normalize
A = np.double(A)
out = np.zeros(A.shape, np.double)
normalized = cv2.normalize(A, out, 1.0, 0.0, cv2.NORM_MINMAX)
或者,您可以通过cv2.normalize
kwarg将浮点数据类型指定为dtype
以强制使用特定的输出数据类型。
A = np.array([1, 2, 3])
out = np.zeros(A.shape, np.double)
normalized = cv2.normalize(A, out, 1.0, 0.0, cv2.NORM_MINMAX, dtype=cv2.CV_64F)
答案 1 :(得分:0)
参考@Suever的答案,这里我的工作变量与Matlab的mat2gray相同。
# python function replica of matlab's mat2gray
def matlab_mat2grey(A = false, alpha = min(A.flatten()), beta = max(A.flatten())):
I = A
cv2.normalize(A, I, alpha , beta ,cv2.NORM_MINMAX)
I = np.uint8(I)
return I