9
votes

I have a numpy 2d matrix which represents a colored image. This matrix has some negative and floating point numbers but of course I can display the image using imshow(my_matrix).

my_matrix_screenshot

I need to perform histogram equalization to this colored image so I found a code here in stackoverflow using cv2 (OpenCV Python equalizeHist colored image) but the problem is I am unable to convert the 2d matrix to cv matrix which takes three channels for RGB.

I was searching again but all I found is to convert regular 3d numpy matrix to cv2 matrix so how can numpy 2d matrix be converted to cv2 matrix which has 3 channels?

2
What is the output of my_matrix.shape?akilat90
The output is (90, 100)user2266175
"I have a numpy 2d matrix which represents a colored image" If you know the original shape of this color image, you can use np.reshape() to convert this to a 3D arrayakilat90
new_img = np.reshape(img,(rows,cols/3,3)zindarod
It gives an error: ValueError: cannot reshape array of size 9000 into shape (90,33,3) in this line: new_img = np.reshape(new_img_tmp,(int(new_img_tmp.shape[0]), int(new_img_tmp.shape[1]/3),3))user2266175

2 Answers

9
votes

because the numpy.ndarray is the base of cv2, so you just write the code as usual,like

img_np = np.ones([100,100])
img_cv = cv2.resize(img_np,(200,200))

you can try

-3
votes

It is better to stack the existing numpy array one above the other of its own copy than to reshape it and add the third axis. Check this code:

import numpy as np
import matplotlib.pyplot as plt

a = np.random.rand(90, 100) # Replace this line with your 90x100 numpy array.
a = np.expand_dims(a, axis = 2)
a = np.concatenate((a, a, a), axis = 2)
print(a.shape)
# (90, 100, 3)
plt.imshow(a)
plt.show()

You will get a gray colored image.