python - Python-OpenCV中的本地规范化

标签 python opencv normalization

我正在尝试在python中实现与本篇文章相同的功能: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)。

enter image description here

最佳答案

您的实现中存在一些错误,因此这是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

关于python - Python-OpenCV中的本地规范化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43240604/

相关文章:

python - 使用 .write() 追加文件,但想使用变量

python elasticsearch使用传输客户端

ruby - OpenCV与Ruby错误

python - 如何在 windows 7 x64 上的 python 3.4 中使用 OpenCV?

r - 如何测试缺失值的多元正态性?

javascript - 如何设置规范化数据的数组索引

Python - 从 QlineEdit 读取数据并以十六进制字节发送到串行?

python - zip(list) 和 zip(*list) 的区别

python - 如何将特定的 C 模块移植到 Python 3?

sql - 归一化硬件