opencv チャネル分離の分割、マージ

1.チャンネル分類split()

チャンネル分離はカラー画像処理に使用でき、画像オブジェクトは通常の 3 チャンネル BGR カラー画像で、分離後の 3 チャンネルは b、g、r です。
アルファチャンネル付きのBGRA 4チャンネル画像であれば、分離後のb、g、r、aとなります。]
画像が HSV 画像などの他の色空間の画像である場合、3 つの分離された画像はそれぞれ h、s、v になります。

import cv2
def show_img(win_name,img,wait_time=0,img_ratio=0.5,is_show=True):
    if is_show is not True:
        return 
    rows = img.shape[0]
    cols = img.shape[1]
    cv2.namedWindow(win_name, cv2.WINDOW_NORMAL )#cv2.WINDOW_AUTOSIZE)
    cv2.resizeWindow(win_name,(int(cols*img_ratio),int(rows*img_ratio)))
    cv2.imshow(win_name,img)
    if wait_time >= 0:
        cv2.waitKey(wait_time)
        
img = cv2.imread('..\\lena.jpg')
#img = cv2.imread('..\\opencv-logo.png',cv2.IMREAD_UNCHANGED)
if img is not None and len(img.shape)==3: #彩色图像才可以做通道分离
    print('img.shape:',img.shape)
    show_img('img',img,-1)  
    if img.shape[2] == 3:                 #如果是3通道,分离出3个图像实例
        b,g,r = cv2.split(img)     
        show_img('b',b,-1)
        show_img('g',g,-1)
        show_img('r',r,-1)
        cv2.waitKey(0)
    elif img.shape[2] == 4:               #如果是4通道
        b,g,r,a = cv2.split(img)
        show_img('b',b,-1)
        show_img('g',g,-1)
        show_img('r',r,-1)
        show_img('a',a,-1) 
        cv2.waitKey(0)

2. インデックス モードのチャネル分離では
、img[:,:,0] を使用して 0 チャネルまたは b チャネルを分離するなど、numpy 配列のスライスまたはインデックス操作を使用します。img[:,:,1] は g チャネルに対応し、img[ :,: ,2] が r チャネルに対応し、img[:,:,3] がある場合はアルファ チャネルに対応します。

if img.shape[2] == 3:                 #如果是3通道,分离出3个图像实例
        b = img[:,:,0]
        g = img[:,:,1]    
        r = img[:,:,2]             
        show_img('b',b,-1)
        show_img('g',g,-1)
        show_img('r',r,-1)
        cv2.waitKey(0)
elif img.shape[2] == 4:               #如果是4通道
        b = img[:,:,0]
        g = img[:,:,1]    
        r = img[:,:,2]    
        a = img[:,:,3] 
        show_img('b',b,-1)
        show_img('g',g,-1)
        show_img('r',r,-1)
        show_img('a',a,-1) 
        cv2.waitKey(0)

3. チャネルの結合 merge()
既存の複数のチャネル画像がタプルに構築され、merge() に渡されて、画像の結合が実現されます。
merge() のパラメータはマルチチャンネル画像で構成されるタプルです

import cv2
img = cv2.imread('lena.jpg')  
b = img[:,:,0]
g = img[:,:,1]    
r = img[:,:,2]             
img2 = cv2.merge((b,g,r)) #传入bgr构成的元组
cv2.imshow('merged',img2) 
cv2.waitKey(0)

4. グレースケール画像を分離する

import cv2
img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE) 
print('img.shape:',img.shape)
res = cv2.split(img)
#单通道的灰度图用split()分离后,实际得到的是一个包含了array类型的list,效果和对一个numpy数组做split操作是类似的。

おすすめ

転載: blog.csdn.net/aqiangdeba/article/details/129762727
おすすめ