我们一般利用cv2.imread来读取彩色图像和灰度图像,并可利用cv2.imshow来显示图像;但在特殊场合下,我们为了方便对比区分,需采用matplotlib.pyplot来显示图像,就如下图所示。
本次遇到的问题是两种方法显示彩色和灰度图像的结果有差异,当利用cv2.imshow显示读取彩色图像时,会“偏黄”;当利用cv2.imshow显示读取的灰度图像时符合我们正常的灰度图像,但利用plt.show显示读取的灰度图像时更像是彩色的,代码和图像如下所示。
代码:
import cv2 #opencv的读取格式是BGR
# print(cv2.__version__)
import matplotlib.pyplot as plt
##读取图像数据
def cv_show(name,img): #创建窗口展示图像
cv2.imshow(name, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
img = cv2.imread('picture.png',cv2.IMREAD_COLOR) #读取彩色图
print(img)
cv_show('image',img) #显示彩色图
img1 = cv2.imread('picture.png',cv2.IMREAD_GRAYSCALE) #读取并转换成灰度图
cv_show('image',img1) #显示灰度图
plt.subplot(121),plt.imshow(img),plt.title('IMG') #显示彩色图
plt.subplot(122),plt.imshow(img1),plt.title('IMG1') #显示灰度图
plt.show()
cv2显示彩色和灰度图:
plt显示彩色和灰度图:
对于彩色图片,一般由R,G,B三个通道构成。然而,需要注意的是,OpenCV里彩色图片加载时是按照BGR的顺序,Matplotlib里彩色图片加载时是按照RGB的顺序。所以,当我们用cv2.imread读入图片,用cv2.imshow来显示时自然是不会出问题的,但若用plt.imshow来显示就会出现问题。所以我们需要对通道进行转换后再显示。
对于灰度图,通过查阅matplotlib的官方文档发现,plt.imshow()不能直接显示单通道的灰度图,而cv2.imread()所读取的灰度图是单通道的灰度图,正确显示灰度图的方法是显示三通道的灰度图,所以,如果我们想要正确显示上面的灰度图,要先把cv2.imread()读到的单通道的灰度图转换成三通道的灰度图,然后再用plt.imshow()显示出来,但这种方法过于繁琐。我们只需设置cmap的值为‘gray’便可实现正常灰度图的显示,但前提是必须读取为灰度图。
import cv2 #opencv的读取格式是BGR
# print(cv2.__version__)
import matplotlib.pyplot as plt
##读取图像数据
def cv_show(name,img): #创建窗口展示图像
cv2.imshow(name, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
img = cv2.imread('picture.png',cv2.IMREAD_COLOR) #读取彩色图
img1 = cv2.imread('picture.png',cv2.IMREAD_GRAYSCALE) #读取并转换成灰度图
b,g,r = cv2.split(img)
img2 = cv2.merge((r,g,b))
plt.subplot(121),plt.imshow(img2),plt.title('IMG') #显示彩色图
plt.subplot(122),plt.imshow(img1,cmap='gray'),plt.title('IMG1') #显示灰度图时,要设置‘gray’ 读取的图片也应是灰度图
plt.show()
第一张图片是在学习图像处理中的边界填充时所制作的,边界填充有四种方法,分别为复制边缘像素填充法、反射法填充、反射法:以最边缘像素为轴填充、外包装法、常量法填充。代码如下:
import cv2 #opencv的读取格式是BGR
# print(cv2.__version__)
import matplotlib.pyplot as plt
img = cv2.imread('picture.png',cv2.IMREAD_COLOR) #读取彩色图
img1 = cv2.imread('picture.png',cv2.IMREAD_GRAYSCALE) #读取并转换成灰度图
##边界填充
top_size,bottom_size,left_size,right_size = (50,50,50,50)
img2 = cv2.merge((r,g,b))
replicate = cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,borderType = cv2.BORDER_REPLICATE) #复制边缘像素填充法
reflect = cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,borderType = cv2.BORDER_REFLECT)#反射法填充
reflect101 = cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,borderType = cv2.BORDER_REFLECT_101)#反射法:以最边缘像素为轴填充
wrap = cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,borderType = cv2.BORDER_WRAP)#外包装法
constant = cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,borderType = cv2.BORDER_CONSTANT,value = 5)#常量法填充
plt.subplot(231),plt.imshow(img2),plt.title('ORIGINAL') #plt.imshow显示彩色图时,要掉换成RGB顺序
plt.subplot(232),plt.imshow(replicate,cmap='gray'),plt.title('REPLICATE') #显示灰度图时,要设置‘gray’ 读取的图片也应是灰度图
plt.subplot(233),plt.imshow(reflect,cmap='gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,cmap='gray'),plt.title('REFLECT101')
plt.subplot(235),plt.imshow(wrap,cmap='gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,cmap='gray'),plt.title('CONSTANT')
plt.show()