I have the same problem with him: Scaling a matrix in OpenCV
I got the same problem with him, I have a colored picture, I used matlab to read the picture: Input = imread('input1.jpg');
, and the format of the picture is 612x612x3 uint8, I print the 5x5x1 pixel in the picture as below: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
by using the mat2gray function: rgb_out = mat2gray(Input);
, these pixels can be transformed to this, they all in the range between 0 and 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
so the question is how can I implement this in Opencv with Python, I tried the code as below:
print(Input) rgb_out = np.zeros(Input.shape, np.uint8) cv2.normalize(Input,rgb_out,1,0,cv2.NORM_MINMAX) print(rgb_out)
but the first print is :
[[[205 207 201] [205 207 201] [205 207 201] ..., [232 254 242] [232 254 242] [231 253 241]]...
and the elements in the rgb_out is no more than 1 or 0. please help, thanks.
Advertisement
Answer
Your input matrix is an integer datatype and your output matrix is defined to be np.uint8
(an integer type). By default, cv2.normalize
is going to return a result that is the same datatype as the inputs. You’ll want to use floating point datatypes if you want output values between 0.0
and 1.0
.
One option would be to convert your input and outputs to np.double
prior to calling 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)
Alternately, you can specify a floating point datatype to cv2.normalize
via the dtype
kwarg to force a specific output datatype.
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)