天天看點

Python +openCv 實作BGR2HSI和HSI2BGR

關于轉換原理參照http://blog.sina.com.cn/s/blog_6c41e2f30100xusj.html

import cv2
import numpy as np
img=cv2.imread('C:/Users/53121/Desktop/IMAGE/road.jpg')


#BGR轉HSI,得到的HSI三通道取值範圍都在0到1之間 
def BGR2HSI(bgr_img):
    bgr=bgr_img.copy()
    B,G,R=cv2.split(bgr/)
    hsi_img=bgr.copy()/
    H,S,I=cv2.split(hsi_img)
    h,w=B.shape
    for i in range(h):
        for j in range(w):
            bgr_min=min(B[i,j],G[i,j],R[i,j])
            bgr_sum=B[i,j]+G[i,j]+R[i,j]
            I[i,j]=bgr_sum/
            S[i,j]=-*bgr_min/bgr_sum
            cov=(R[i,j]-G[i,j])+(R[i,j]-B[i,j])
            var=*np.sqrt((R[i,j]-G[i,j])**+(R[i,j]-B[i,j])*(G[i,j]-B[i,j])**)
            theta=np.arccos(cov/var)
            if G[i,j]>=B[i,j]:
                H[i,j]=theta/(*np.pi)
            else:
                H[i,j]=(*np.pi-theta)/(*np.pi)  
    hsi_img[:,:,]=H
    hsi_img[:,:,]=S
    hsi_img[:,:,]=I    
    return hsi_img

#HSI轉BGR,得到的BGR三通道取值範圍都在0到1之間 
def HSI2BGR(hsi_img):
    hsi=hsi_img.copy()
    H,S,I=cv2.split(hsi)
    bgr_img=hsi_img.copy()
    B,G,R=cv2.split(bgr_img)
    h,w=B.shape
    for i in range(h):
        for j in range(w):            
            if S[i,j]<e-:
                R[i,j]=I[i,j]
                G[i,j]=I[i,j]
                B[i,j]=I[i,j]
            else:
                H[i,j]*=          
                if H[i,j]> and H[i,j]<=:
                    B[i,j]=(-S[i,j])*I[i,j]
                    sigma=(H[i,j]-)*np.pi/
                    temp=np.tan(sigma)/np.sqrt()
                    G[i,j]=(+*temp)*I[i,j]-(.+*temp)*B[i,j]
                    R[i,j]=*I[i,j]-G[i,j]-B[i,j]
                elif H[i,j]> and H[i,j]<=:
                    R[i,j]=(-S[i,j])*I[i,j]
                    sigma=(H[i,j]-)*np.pi/
                    temp=np.tan(sigma)/np.sqrt()
                    B[i,j]=(+*temp)*I[i,j]-(.+*temp)*R[i,j]
                    G[i,j]=*I[i,j]-R[i,j]-B[i,j]
                elif H[i,j]> and H[i,j]<=:
                    G[i,j]=(-S[i,j])*I[i,j]
                    sigma=(H[i,j]-)*np.pi/
                    temp=np.tan(sigma)/np.sqrt()
                    R[i,j]=(+*temp)*I[i,j]-(.+*temp)*G[i,j]
                    B[i,j]=*I[i,j]-G[i,j]-R[i,j]
    bgr_img[:,:,]=B
    bgr_img[:,:,]=G
    bgr_img[:,:,]=R
    return bgr_img

hsi=BRG2HSI(img)
bgr=HSI2BGR(hsi)