2017-03-07 180 views
2

我是新的东西opencv的和直方图均衡化的Python对于彩色图像

我试图直方图均衡手动的方式做的,不知我的输出类似 this

首先我转换格式YCR_CB首先格式化,然后将其分割为每个y,cr和cb。然后我在y层做了直方图均衡化的事情。

这里是我的代码:

from __future__ import division 
    import cv2 
    import numpy as np 

    img1 = cv2.imread("sup.jpg") 

    img2 = cv2.cvtColor(img1,cv2.COLOR_BGR2YCR_CB) 

    y,cr,cb = cv2.split(img2) 

    #y = cv2.equalizeHist(y) 

    x =y 

    height,width = y.shape 

    hist = [0]*256 
    pmf = [0]*256 
    cdf = [0]*256 
    levelBaru = [0]*256 

    cv2.imshow("y before",x) 
    cv2.waitKey(0) 

    for i in range(0,height): 
     for j in range(0,width): 
      hist[y.item(i,j)] += 1 
      #hist[y[i,j]] += 1 

    for i in range(0,256): 
      #cari pmf 
     pmf[i] = round(hist[i]/(height*width),4) 

    print "pmf done" 

    cdf[0] = pmf[0] 

    for i in range(1,256):    #cari cdf 
     cdf[i] = cdf[i-1]+pmf[i] 

    for i in range(1,256):    #cari levelBaru 
     levelBaru[i] = int(cdf[i]*255) 

    for i in range(0,height):   #baru 
     for j in range(0,width): 
      for k in range (0,256): 
       if(y.item(i,j)==k): 
        #print i," ",levelBaru[i] 
        y.itemset((i,j),levelBaru[k]) 

    img2 = cv2.merge((y,cr,cb)) 
    img2 = cv2.cvtColor(img2,cv2.COLOR_YCR_CB2BGR) #supaya ga error pas di stack 


    #cv2.namedWindow('result', cv2.WINDOW_NORMAL) 
    cv2.imshow('result',img2) 

    cv2.waitKey(0) 
    cv2.destroyAllWindows 

有点儿粘发现的bug,如果有人能帮助我,将是真棒

+0

您应该包括在讨论的输出,而不是作为一个超链接 – JoeG

回答

2

按要平衡彩色图像的直方图的问题标题,通过分割它在YCrCb域。在编写用于均衡直方图的算法方面没有意义,因为它似乎在附加的代码片段中,OpenCV已经有一个方法为cv2.eqHist()来满足您的目的。

import cv2 

img = cv2.imread("path/to/Lenna.png") 

img_y_cr_cb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) 
y, cr, cb = cv2.split(img_y_cr_cb) 

# Applying equalize Hist operation on Y channel. 
y_eq = cv2.equalizeHist(y) 

img_y_cr_cb_eq = cv2.merge((y_eq, cr, cb)) 
img_rgb_eq = cv2.cvtColor(img_y_cr_cb_eq, cv2.COLOR_YCR_CB2BGR) 

输入:

enter image description here

输出:

enter image description here

+0

特别提到作者试 自己实现这个功能,因此我猜他知道OpenCV内置的函数。我不同意在实施已解决问题的解决方案方面没有意义。从教育的角度来看,这是有帮助的:让您更深入地了解equalizeHist()背后的过程,并教您如何处理低级图像操作的许多重要方面。 – m3h0w

+0

是的,我已经知道这个功能。 – Johnny21