2017-04-05 14 views
0

Ich versuche, in Python als die gleiche Funktion implementieren zu diesem Beitrag: linkPython - Lokale Normalisierungs in OpenCV

Ich kann aber kein glattes Ergebnis erhalten, was auch immer ich versuche, obwohl ich beide Implementierung versuchte , das korrigierte der OP und die zweite Antwort zur Verfügung gestellt.

Ich vermisse wahrscheinlich etwas kleines, aber ich kann nicht herausfinden, was.

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 

I muß ich Ende präzise, ​​dass verwenden cv2.CV_32S weil mit der Codierung des OP I mit einem schwarzen Bild enden. Für den Rest benutze ich das gleiche Sigma, 2.0 und 20.0.

enter image description here

Antwort

1

Es gab einige Fehler in der Implementierung, hier also der korrekt übersetzte Code in Python ist:

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) 

Ausgang:

enter image description here

+0

ich jetzt das gute Ergebnis bekam , Vielen Dank ! –