2015-08-13 21 views
6

Ho bisogno di fare un'equalizzazione dell'istogramma per un'immagine colorata.OpenCV Python equalizeHist colour image

Per prima cosa ho convertire l'immagine colorata di grigio e dare alla funzione equalizeHist:

image = cv2.imread("photo.jpg") 
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 
cv2.equalizeHist(image) 
cv2.imshow("equalizeHist", image) 
cv2.waitKey(0) 

Ma dopo questo ho bisogno di convertire l'immagine in RGB; Come lo posso fare?

risposta

16

Fonte: https://www.packtpub.com/packtlib/book/Application-Development/9781785283932/2/ch02lvl1sec26/Enhancing%20the%20contrast%20in%20an%20image

import cv2 
import numpy as np 

img = cv2.imread('input.jpg') 

img_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV) 

# equalize the histogram of the Y channel 
img_yuv[:,:,0] = cv2.equalizeHist(img_yuv[:,:,0]) 

# convert the YUV image back to RGB format 
img_output = cv2.cvtColor(img_yuv, cv2.COLOR_YUV2BGR) 

cv2.imshow('Color input image', img) 
cv2.imshow('Histogram equalized', img_output) 

cv2.waitKey(0) 
0

non sono sicuro che funzioni correttamente:

def histogram_equalize(img): 
    b, g, r = cv2.split(img) 
    red = cv2.equalizeHist(r) 
    green = cv2.equalizeHist(g) 
    blue = cv2.equalizeHist(b) 
    return cv2.merge((blue, green, red)) 
+2

Equalizza i canali RGB in modo indipendente e, quindi, produce colori distorti. – broofa

0

Se u vuole equalizeHist l'immagine RGB, u non dovrebbe convertire in grigio invece di equalizzazione RGB canali uno per uno.

Quindi, penso che forse qui è che u vuole:

def equalize_hist(img): 
    for c in xrange(0, 2): 
     img[:,:,c] = cv2.equalizeHist(img[:,:,c]) 

    cv2.imshow('Histogram equalized', img) 
    cv2.waitKey(0) 

    return img 
0

Un approccio più generale sarebbe trasformando i valori RGB in un altro spazio che contiene un valore di luminescenza/intensità (Luv, Lab, HSV, HSL) , applica histeq solo sul piano di intensità ed esegui la trasformazione inversa.