Python - OpenCV 中的局部归一化
Python - Local Normalization in OpenCV
我正在尝试在 python 中实现与此 post 相同的功能:link
但是,无论我尝试什么,我都无法获得顺利的结果,即使我尝试了两种实现方式、更正的 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 的编码我最终得到了一个黑色图像。对于其余部分,我使用相同的 sigma,2.0 和 20.0。
您的实现中存在一些错误,因此这是 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)
输出:
我正在尝试在 python 中实现与此 post 相同的功能:link
但是,无论我尝试什么,我都无法获得顺利的结果,即使我尝试了两种实现方式、更正的 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 的编码我最终得到了一个黑色图像。对于其余部分,我使用相同的 sigma,2.0 和 20.0。
您的实现中存在一些错误,因此这是 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)
输出: