绘制RGB和HSV的单通道图

对一副图像进行分割通道,并且显示

一、图像通道分割方法

# 方法一:分离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

五、赋上画他们的直方图

https://blog.csdn.net/m0_63172128/article/details/125628439?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22125628439%22%2C%22source%22%3A%22m0_63172128%22%7D&ctrtid=uEyN3

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彩色面团儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值