import cv2
a=cv2.imread("..\\image\\lenacolor.png")
b=cv2.cvtColor(a,cv2.COLOR_BGR2GRAY)
cv2.imshow("lenaColor",a)
cv2.imshow("lenaGray",b)
print(f"a:{a.shape}")
print(f"b:{b.shape}")
cv2.waitKey()
cv2.destroyAllWindows()
#方式一:使用cv2.show()函数输出
import cv2
import matplotlib.pyplot as plt
a=cv2.imread("..\\image\\lenacolor.png")
b=cv2.cvtColor(a,cv2.COLOR_BGR2RGB)
cv2.imshow("BGR",a)
cv2.imshow("RGB",b)
cv2.waitKey()
cv2.destroyAllWindows()
#方式二:使用plt.imshow()函数输出,可以规定矩阵同时输出多张图像
# import cv2
# import matplotlib.pyplot as plt
# a=cv2.imread("..\\image\\lenacolor.png")
# b=cv2.cvtColor(a,cv2.COLOR_BGR2RGB)
# plt.subplot(121),plt.imshow(a),plt.axis('off')
# plt.subplot(122),plt.imshow(b),plt.axis('off')
# plt.show()
使用cv2.imshow() 函数输出的图像
使用matplotlib.pyplot.imshow()输出的图像
import cv2
a=cv2.imread("..\\image\\lena256.bmp",cv2.IMREAD_UNCHANGED)
b=cv2.cvtColor(a,cv2.COLOR_GRAY2BGR)
cv2.imshow("GRAY",a)
cv2.imshow("BGR",b)
print(a.shape) #证明a是GRAY
print(b.shape) #证明b是BGR
cv2.waitKey()
cv2.destroyAllWindows()
输出:
(256, 256)
(256, 256, 3)
将灰度图转换成BGR图后将三个通道全部获取,发现一样
import cv2
a=cv2.imread("..\\image\\lena256.bmp",cv2.IMREAD_UNCHANGED)
b=cv2.cvtColor(a,cv2.COLOR_GRAY2BGR)
bb,bg,br=cv2.split(b)
cv2.imshow("bb",bb)
cv2.imshow("bg",bg)
cv2.imshow("br",br)
print(bb.shape,bg.shape,br.shape) #三个图像一模一样
cv2.waitKey()
cv2.destroyAllWindows()
【利用掩膜(mask)进行“与”操作】
即掩膜图像白色区域是对需要处理图像像素的保留,黑色区域是对需要处理图像像素的剔除 其余按位操作原理类似只是效果不同而已。 mask = cv2.inRange(img_HSV,lower_blue,upper_blue)
第一个参数:hsv指的是原图(hsv类型的图)
第二个参数:lower_red指的是图像中低于这个lower_red的值,图像值变为0
第三个参数:upper_red指的是图像中高于这个upper
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('E:\\Image\\csdnImage\\find_blue.png',cv2.IMREAD_UNCHANGED)
# 转换到 HSV
img_HSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
# 设定蓝色的阈值
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
# 根据阈值构建掩模
mask = cv2.inRange(img_HSV,lower_blue,upper_blue) #lower20===>0,upper200==>0,lower~upper==>255
print(lower_blue,upper_blue)
#对原图像和掩模进行位运算
res = cv2.bitwise_and(img,img,mask=mask)
cv2.imshow('img',img)
cv2.imshow('mask',mask)
cv2.imshow('res',res)
cv2.waitKey()
cv2.destroyAllWindows()
补充
# 如何准确找到某个颜色的阈值呢?
# 现在你可以分别用 [H-100,100,100] 和 [H+100,255,255] 做上下阈值。
# 除了这个方法之外,你可以使用任何其他图像编辑软件(例如 GIMP)
# 或者在线转换软件找到相应的HSV值,但是最后别忘了调节HSV的范围。
import cv2
import numpy as np
import matplotlib.pyplot as plt
green=np.uint8([[[255,0,0]]])
hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print(hsv_green)
# 输出:[[[120 255 255]]]
# [H-10,100,100] 和 [H+10,255,255]得到阈值如下:
# [110 100 100] 和 [130 255 255]
利用mask进行“与”操作
def getHsv(data):
blue_hsv = cv2.cvtColor(data, cv2.COLOR_BGR2HSV)
print(data,blue_hsv)
return blue_hsv
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('opencv.png',cv2.IMREAD_UNCHANGED)
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#得到蓝色部分
blue = np.uint8([[[255,0,0]]])
first = getHsv(blue)[0][0][0]
print(first)
lowerb=np.array([first-10,100,100])
upperb=np.array([first+10,255,255])
mask = cv2.inRange(img_hsv,lowerb,upperb)
res1 = cv2.bitwise_and(img,img,mask=mask)
#得到绿色部分
green = np.uint8([[[0,255,0]]])
first = getHsv(green)[0][0][0]
print(first)
lowerb=np.array([first-10,100,100])
upperb=np.array([first+10,255,255])
mask = cv2.inRange(img_hsv,lowerb,upperb)
res2 = cv2.bitwise_and(img,img,mask=mask)
#得到红色部分
red = np.uint8([[[0,0,255]]])
first = getHsv(red)[0][0][0]
print(first)
lowerb=np.array([first-10,100,100])
upperb=np.array([first+10,255,255])
mask = cv2.inRange(img_hsv,lowerb,upperb)
res3 = cv2.bitwise_and(img,img,mask=mask)
cv2.imshow('res1',res1)
cv2.imshow('res2',res2)
cv2.imshow('res3',res3)
#将三种单独的颜色组合在一起
t = cv2.addWeighted(res1,0.5,res2,0.5,0)
result = cv2.addWeighted(t,0.5,res3,0.5,0)
cv2.imshow('result',result)
cv2.waitKey()
cv2.destroyAllWindows()
# blue:[[[120 255 255]]]
# green:[[[60 255 255]]]
# res:[[[0 255 255]]]