我在OpenCV
中使用各种方法来预处理一些图像。当传递对象时,我经常会遇到与数据类型有关的错误,例如:
import cv2
import numpy as np
#import image and select ROI
image1 = cv2.imread('image.png')
roi_1 = cv2.selectROI(image1) # spacebar to confirm selection
cv2.waitKey(0)
cv2.destroyAllWindows()
# preprocesssing
imCrop_1 = image1[int(roi_1[1]):int(roi_1[1]+roi_1[3]), int(roi_1[0]):int(roi_1[0]+roi_1[2])]
grey1 = cv2.cvtColor(imCrop_1, cv2.COLOR_RGB2GRAY)
thresh, bw_1 = cv2.threshold(grey1, 200, 255, cv2.THRESH_OTSU)
canny_edge1 = cv2.Canny(bw_1, 50, 100)
#test=roi_1 # Doesn't work with error: /home/bprodz/opencv/modules/photo/src/denoising.cpp:182: error: (-5) Type of input image should be CV_8UC3 or CV_8UC4! in function fastNlMeansDenoisingColored
#test = imCrop_1 # works
#test = grey1 # doesn't work with error above
#test = bw_1 # doesn't work with error above
#test = canny_edge1 # doesn't work with error above
dst = cv2.fastNlMeansDenoisingColored(test,None,10,10,7,21)
# Check object types
type(imCrop_1) # returns numpy.ndarray - would like to see ~ CV_8UC3 etc.
type(grey1) # returns numpy.ndarray
目前我只是使用反复试验,是否有一种更有条理的方法可用于检查和转换不同的对象类型?
答案 0 :(得分:1)
您可能使用了错误的方法,为此,您可能会根据cv2. fastNlMeansDenoisingColored
的文档从您使用的方法名称中获得提示:
src - 输入8位3通道图像。
dst - 输出与src具有相同大小和类型的图像。
所以,如果想要使用cv2.cvtColor(src, cv2.COLOR_GRAY2BGR)
,那么你需要将src mat转换为3通道矩阵,可以这样做:
img.shape
但是如果你有灰度图像,那么你可以使用cv2.fastNlMeansDenoising
,它接受单个通道和三个通道作为源垫,并保存转换图像的步骤。
您还可以使用img.dtype
检查给定矩阵的通道数。它将返回(100,100)灰度矩阵,(100,100,3)用于3通道矩阵,(100,100,4)用于4通道矩阵。您还可以使用{{1}}