对一副图像进行分割通道,并且显示
一、图像通道分割方法
# 方法一:分离bgr通道,在进行合并成rgb,现在确定后面的通道顺序也为rgb
b, g, r = cv2.split(img)
img1 = cv2.merge([r, g, b])
cv2.imshow('img1',img1)
#方法二:change BGR to RGB表示将bgr图像转成rgb
# img1=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
# 方法三
# img2 = img[:, :, (2, 1, 0)]
# img2 = img[..., :: -1]
二、python的完整代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
#rgb to hsv
def rgb2hsv(img):
h = img.shape[0]
w = img.shape[1]
H = np.zeros((h,w),np.float32)
S = np.zeros((h, w), np.float32)
V = np.zeros((h, w), np.float32)
r,g,b = cv2.split(img)
r, g, b = r/255.0, g/255.0, b/255.0
for i in range(0, h):
for j in range(0, w):
mx = max((b[i, j], g[i, j], r[i, j]))
mn = min((b[i, j], g[i, j], r[i, j]))
dt=mx-mn
# H
if mx == mn:
H[i, j] = 0
elif mx == r[i, j]:
if g[i, j] >= b[i, j]:
H[i, j] = (60 * ((g[i, j]) - b[i, j]) / dt)
else:
H[i, j] = (60 * ((g[i, j]) - b[i, j]) / dt)+360
elif mx == g[i, j]:
H[i, j] = 60 * ((b[i, j]) - r[i, j]) / dt + 120
elif mx == b[i, j]:
H[i, j] = 60 * ((r[i, j]) - g[i, j]) / dt+ 240
H[i,j] =int( H[i,j] / 2)
#S
if mx == 0:
S[i, j] = 0
else:
S[i, j] =int( dt/mx*255)
#V
V[i, j] =int( mx*255)
return H, S, V
#show all convertion type
flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
print(flags)
img=cv2.imread("./image/apple.jpg")
new=cv2.imread("./image/new.jpg")
cv2.imshow('img',img)
# 方法一:分离bgr通道,在进行合并成rgb,现在确定后面的通道顺序也为rgb
b, g, r = cv2.split(img)
img1 = cv2.merge([r, g, b])
cv2.imshow('img1',img1)
#方法二:change BGR to RGB表示将bgr图像转成rgb
# img1=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
# 方法三
# img2 = img[:, :, (2, 1, 0)]
# img2 = img[..., :: -1]
#方法一change into HSV type
hsv=cv2.cvtColor(img1,cv2.COLOR_RGB2HSV)
# h, s, v = cv2.split(hsv)
##用自己写的函数rgb2hsv,直接get h s v channels
h,s,v = rgb2hsv(img1)
merged = cv2.merge([h,s,v]) #前面分离出来的三个通道
merged=np.array(merged,dtype='uint8')
plt.figure(1)#第一幅图,这里也可以设置画布大小
#第一行第一列图形
ax1 = plt.subplot(2,4,1)
plt.sca(ax1)
plt.imshow(img1)#转化成rgb的图
plt.title("RGB")
#第一行第二列图形
ax2 = plt.subplot(2,4,2)
plt.sca(ax2)
plt.imshow(img1[:,:,0],cmap="gray")
plt.title("R")
#第一行第3列图形
ax3 = plt.subplot(2,4,3)
plt.sca(ax3)
plt.imshow(img1[:,:,1],cmap="gray")
plt.title("G")
#第一行第4列图形
ax4 = plt.subplot(2,4,4)
plt.sca(ax4)
plt.imshow(img1[:,:,2],cmap="gray")
plt.title("B")
#第2行第1列图形
ax5 = plt.subplot(2,4,5)
plt.sca(ax5)
plt.imshow(hsv)
plt.title("HSV")
#第2行第2列图形
ax6 = plt.subplot(2,4,6)
plt.sca(ax6)
plt.imshow(hsv[:,:,0],cmap="gray")
plt.title("H")
#第2行第3列图形
ax7 = plt.subplot(2,4,7)
plt.sca(ax7)
plt.imshow(hsv[:,:,1],cmap="gray")
plt.title("S")
#第2行第4列图形
ax8 = plt.subplot(2,4,8)
plt.sca(ax8)
plt.imshow(hsv[:,:,2],cmap="gray")
plt.title("V")
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
三、结果图
四、相关内容学习
1、合并BGR HSV图像通道:
OpenCV 合并BGR HSV图像通道__久夏青的博客-CSDN博客
2、设置plt.figure()怎么设置可以缩放:Python matplotlib绘图时指定图像大小及放大图像详解https://www.jb51.net/article/247358.htm