2017-04-05 44 views
0

我想在Python實現比這個職位的相同功能的本地規範化:linkPython的 - 在OpenCV中

但是,我不能得到平滑的結果,無論我試試,儘管我都嘗試實施,提供了更正的OP和第二個答案。

我可能錯過了一些小東西,但我找不出什麼。

def local_norm(img, sigma_1, sigma_2): 

    float_gray = img * cv2.CV_32FC1/255.0 
    blur_1 = int(2 * np.ceil(- norm.ppf(0.05, loc=0, scale=sigma_1)) + 1) 
    blurred_1 = cv2.GaussianBlur(float_gray, (blur_1, blur_1), sigma_1, sigma_1) 
    temp_1 = float_gray - blurred_1 

    temp_2 = cv2.pow(temp_1, 2.0) 
    blur_2 = int(2 * np.ceil(- norm.ppf(0.05, loc=0, scale=sigma_2)) + 1) 
    blurred_2 = cv2.GaussianBlur(temp_2, (blur_2, blur_2), sigma_2, sigma_2) 
    temp_2 = cv2.pow(blurred_2, 0.5) 

    float_gray = temp_1/temp_2 
    res = cv2.normalize(float_gray, 0, 255, cv2.NORM_MINMAX) 
    res = res * cv2.CV_32S 
    return res 

我必須精確,以至於到了最後,我用cv2.CV_32S因爲與OP的編碼我結束了一個黑色的圖像。其餘的,我使用相同的西格瑪,2.0和20.0。

enter image description here

回答

1

有你實現一些錯誤,所以在這裏是在Python的正確轉換代碼:

import cv2 
import numpy as np 

img = cv2.imread('lena.png') 

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

float_gray = gray.astype(np.float32)/255.0 

blur = cv2.GaussianBlur(float_gray, (0, 0), sigmaX=2, sigmaY=2) 
num = float_gray - blur 

blur = cv2.GaussianBlur(num*num, (0, 0), sigmaX=20, sigmaY=20) 
den = cv2.pow(blur, 0.5) 

gray = num/den 

cv2.normalize(gray, dst=gray, alpha=0.0, beta=1.0, norm_type=cv2.NORM_MINMAX) 

cv2.imwrite("./debug.png", gray * 255) 

輸出:

enter image description here

+0

我現在得到了很好的效果, 謝謝 ! –