无法显示带有 plt.imshow 的图片
Can't show picture with plt.imshow
我想绘制存储在 numpy 数组 x_val 中的一系列图像,但 plt.imshow(val[1]) 不起作用。另一方面,使用 opencv 它工作正常:
cv2.imshow('image', x_val[1])
cv2.waitKey(0)
cv2.destroyAllWindows()
根据我目前所读的内容,我认为问题在于图像当前处于 BGR 状态并且必须转换为 RGB(如果我错了请纠正我)。所以我尝试了以下方法:
img = cv2.imshow('image', x_val[1])
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
但我收到此错误消息:
File "C:\Users\Maximal\Documents\Python\PyCharm\TrafficSignClassification\model\trafficSignsClassification.py", line 156, in evaluateTestData
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
我尝试的另一件事是这种方法:
img = np.array(x_val[1], dtype=np.uint8)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
这并没有给我一个错误,但图片只是黑色的。我做错了什么?
编辑:
我首先对图片所做的如下:
def preprocessData(self, x_train, x_val, y_train, y_val):
# --- normalize images ---
def normalize(img):
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Grayscale image
img = cv2.equalizeHist(img) # Optimize Lightning
img = img / 255.0 # Normalize px values between 0 and 1
return img
for x in range(len(x_train)):
x_train[x] = normalize(x_train[x])
for x in range(len(x_val)):
x_val[x] = normalize(x_val[x])
# --- transform the data to be accepted by the model ---
y_train = np.array(y_train)
y_val = np.array(y_val)
x_train = np.array(x_train)
x_val = np.array(x_val)
x_train = x_train.reshape(x_train.shape[0], x_train.shape[1], x_train.shape[2], 1)
x_val = x_val.reshape(x_val.shape[0], x_val.shape[1], x_val.shape[2], 1)
print("preprocessing data done.")
return x_train, x_val, y_train, y_val
我在TF2中使用了CNN中的图片,所以我不得不分别对它们进行转换。
我可以在转换前用 plt.imshow() 绘制图片而不会出现问题。但是在这个函数之后只有 cv2.imshow() 有效
我自己找到了答案。我必须将这些值乘以 255 才能获得正确的图像。在所有值都在 0 和 1 之间之前,这会导致黑色图像。
img = np.array(x_val[i]*255, dtype=np.uint8)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
我想绘制存储在 numpy 数组 x_val 中的一系列图像,但 plt.imshow(val[1]) 不起作用。另一方面,使用 opencv 它工作正常:
cv2.imshow('image', x_val[1])
cv2.waitKey(0)
cv2.destroyAllWindows()
根据我目前所读的内容,我认为问题在于图像当前处于 BGR 状态并且必须转换为 RGB(如果我错了请纠正我)。所以我尝试了以下方法:
img = cv2.imshow('image', x_val[1])
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
但我收到此错误消息:
File "C:\Users\Maximal\Documents\Python\PyCharm\TrafficSignClassification\model\trafficSignsClassification.py", line 156, in evaluateTestData
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
我尝试的另一件事是这种方法:
img = np.array(x_val[1], dtype=np.uint8)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
这并没有给我一个错误,但图片只是黑色的。我做错了什么?
编辑: 我首先对图片所做的如下:
def preprocessData(self, x_train, x_val, y_train, y_val):
# --- normalize images ---
def normalize(img):
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Grayscale image
img = cv2.equalizeHist(img) # Optimize Lightning
img = img / 255.0 # Normalize px values between 0 and 1
return img
for x in range(len(x_train)):
x_train[x] = normalize(x_train[x])
for x in range(len(x_val)):
x_val[x] = normalize(x_val[x])
# --- transform the data to be accepted by the model ---
y_train = np.array(y_train)
y_val = np.array(y_val)
x_train = np.array(x_train)
x_val = np.array(x_val)
x_train = x_train.reshape(x_train.shape[0], x_train.shape[1], x_train.shape[2], 1)
x_val = x_val.reshape(x_val.shape[0], x_val.shape[1], x_val.shape[2], 1)
print("preprocessing data done.")
return x_train, x_val, y_train, y_val
我在TF2中使用了CNN中的图片,所以我不得不分别对它们进行转换。 我可以在转换前用 plt.imshow() 绘制图片而不会出现问题。但是在这个函数之后只有 cv2.imshow() 有效
我自己找到了答案。我必须将这些值乘以 255 才能获得正确的图像。在所有值都在 0 和 1 之间之前,这会导致黑色图像。
img = np.array(x_val[i]*255, dtype=np.uint8)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)