我正在尝试实现此公式描述的强度归一化算法:

x'=(x-高斯加权平均值)/ std_deviation

我接下来要介绍的论文描述了我必须使用7x7内核找到与每个像素“x”邻居相对应的高斯加权平均值和标准偏差。

PS:x'是新的像素值。

python - 如何找到结构元素的高斯加权平均和标准偏差-LMLPHP

因此,我的问题是:如何使用7x7内核为图像中的每个像素计算高斯加权平均值和标准偏差?

OpenCV是否提供解决此问题的方法?

import cv2
img = cv2.imread("b.png", 0)
widht = img.shape[0]
height = img.shape[1]
for i in range (widht):
    for j in range (height):
        new_image = np.zeros((height,width,1), np.uint8)
        new_image[i][j] = img[i][j] - ...

最佳答案

作者的原始实现(C++)可在here中找到:请参阅 GenerateIntensityNormalizedDatabase()

另一个学生用python重新实现了此功能。 python的实现是:

import cv2
import numpy as np

def StdDev(img, meanPoint, point, kSize):
    kSizeX, kSizeY = kSize / 2, kSize / 2

    ystart = point[1] - kSizeY if 0 < point[1] - kSizeY < img.shape[0] else 0
    yend = point[1] + kSizeY + 1 if 0 < point[1] + kSizeY + 1 < img.shape[0] else img.shape[0] - 1

    xstart = point[0] - kSizeX if 0 < point[0] - kSizeX < img.shape[1] else 0
    xend = point[0] + kSizeX + 1 if 0 < point[0] + kSizeX + 1 < img.shape[1] else img.shape[1] - 1

    patch = (img[ystart:yend, xstart:xend] - meanPoint) ** 2
    total = np.sum(patch)
    n = patch.size

    return 1 if total == 0 or n == 0 else np.sqrt(total / float(n))


def IntensityNormalization(img, kSize):
    blur = cv2.GaussianBlur(img, (kSize, kSize), 0, 0).astype(np.float64)
    newImg = np.ones(img.shape, dtype=np.float64) * 127

    for x in range(img.shape[1]):
        for y in range(img.shape[0]):
            original = img[y, x]
            gauss = blur[y, x]
            desvio = StdDev(img, gauss, [x, y], kSize)

            novoPixel = 127
            if desvio > 0:
                novoPixel = (original - gauss) / float(desvio)

            newVal = np.clip((novoPixel * 127 / float(2.0)) + 127, 0, 255)
            newImg[y, x] = newVal
    return newImg

要使用强度归一化,可以执行以下操作:
kSize = 7
img = cv2.imread('{IMG_FILENAME}', cv2.IMREAD_GRAYSCALE).astype(np.float64)
out = IntensityNormalization(img, kSize)

要可视化生成的图像,请不要忘记将out转换回np.uint8(why?)。如果您想重现他的结果,建议您使用C++中的原始实现。

免责声明:我与该lab的作者来自同一paper

关于python - 如何找到结构元素的高斯加权平均和标准偏差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44906530/

10-09 09:15