我正在尝试实施此公式描述的强度标准化算法:
x'=(x - gaussian_weighted_average)/ std_deviation
我正在阅读的论文描述了我必须使用7x7内核找到高斯加权平均值和与每个像素“x”邻居相对应的标准差。
PS:x'是新的像素值。
所以,我的问题是:如何使用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] - ...
答案 0 :(得分:2)
可以找到作者的原始实现(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 ++中使用原始实现。