opencv入门课程:彩色图像灰度化和二值化(采用skimage库和opencv库两种方法)

用最简单的办法实现彩色图像灰度化和二值化:

首先采用skimage库(skimage库现在在scikit_image库中)实现:

from skimage.color import rgb2gray
import numpy as np
import matplotlib.pyplot as plt

"""
skimage库实现彩色图像的灰度化、二值化
"""

#输入原图像
plt.subplot(221)
#使用plt.subplot来创建小图. plt.subplot(221)表示将整个图像窗口分为2行2列, 当前位置为1.
img = plt.imread("lenna.png")	#图像输入
plt.imshow(img)	#图像输出
print("---image lenna----")
print(img)

# 灰度化
img_gray = rgb2gray(img)
plt.subplot(222)
plt.imshow(img_gray, cmap='gray')
print("---image gray----")
print(img_gray)

#二值化
img_binary = np.where(img_gray >= 0.5, 1, 0)
#像素值大于0.5为1,小于0.5为0
print("-----imge_binary------")
print(img_binary)
print(img_binary.shape)		#输出图像分辨率
plt.subplot(223)
plt.imshow(img_binary, cmap='gray')
plt.show()

运行结果:
opencv入门课程:彩色图像灰度化和二值化(采用skimage库和opencv库两种方法)_第1张图片

采用opencv库(cv2)实现:

import matplotlib.pyplot as plt
import cv2

"""
cv2实现彩色图像的灰度化、二值化
这里采用plt输出,如果需要cv2输出,只需要将plt的输出注释掉,将cv2的输出取消注释
"""


#输入原图像
plt.subplot(221)
img = cv2.imread("lenna.png", 1)
#1是彩色输入,0是灰色输入
#cv2.imshow('img',img)

#通道转换
b, g, r = cv2.split(img)
img = cv2.merge([r, g, b])

plt.imshow(img)


#灰度化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_gray1 = img_gray
plt.subplot(222)
#cv2.imshow('img2',img_gray)
plt.imshow(img_gray,cmap='gray')

#二值化
cv2.threshold(img_gray1,127,255,0,img_gray1)
#像素值大于127为255(白色),小于为0(黑色)
plt.subplot(223)
plt.imshow(img_gray1,cmap='gray')
plt.show()

# cv2.imshow('img3',img_gray1)
# cv2.waitKey(0)

需要注意的问题:

注意一:
在plt读取图像之后,图像的每一个像素值都在[0,1]之间,在之后的cv2读取的图像,每一个像素值在[0,255]之间,所以在二值化时,plt是阈值为0.5,像素值分成0或1,而cv2中阈值是127,像素值分为0或255。

注意二
无论谁cv输出还是plt输出的最后的结尾都需要加上cv.waitkey(0)或者plt.show()不然输出图像转瞬即逝,很快就消失了,不能长时间停留。

注意三:
这里采用plt或者cv两种输出方式!但是注意,当cv输入plt输出的时候会发现图像色彩失真!
opencv入门课程:彩色图像灰度化和二值化(采用skimage库和opencv库两种方法)_第2张图片
因为 opencv 的接口使用BGR模式,而 matplotlib.pyplot 接口使用的是RGB模式
解决方法是:
在cv输入图像后把通道顺序变换一下,就在cv2.imread输入后面添加

b, g, r = cv2.split(img)
img = cv2.merge([r, g, b])

添加后运行结果:
opencv入门课程:彩色图像灰度化和二值化(采用skimage库和opencv库两种方法)_第3张图片
注意四:
在灰度化和二值化图像用plt输出的时候必须添加cmap = 'gray',如果不添加得不到想要的图像。
至于原因,我在网上得到最好的解释是:

当img1具有形状(M,N,3)或(M,N,4)时,img1中的值将被解释为RGB或RGBA值。在这种情况下,cmap将被忽略。每the help(plt.imshow) docstring:

cmap:~matplotlib.colors.Colormap,可选,默认:无

  如果为None,则默认为rc image.cmap值。 cmap会被忽略   X有RGB(A)信息

但是,如果img是形状(M,N)的数组,则cmap会控制用于显示值的色彩映射。

你可能感兴趣的:(opencv,计算机视觉,python)