【问题标题】:contrast normalization of image python图像python的对比度归一化
【发布时间】:2022-11-05 19:52:04
【问题描述】:

我想问如何使用python代码获取图像结果(图标),如中所示

其中 ishade 是经过预处理的图像,std(Ishade) 是该图像的标准差

result = ndimage.median_filter(blur, size=68)
std=cv2.meanStdDev(result)

【问题讨论】:

    标签: python image-processing


    【解决方案1】:

    我尝试按照您发布的参考文献中的文章以及该帖子中对原始文章的参考进行操作。但我不完全了解他们的所作所为。尽管如此,这是我的解释(除了最初的 CLAHE)。您可以根据需要调整均值和中值滤波器大小。

    输入:

    import cv2
    import numpy as np
    import skimage.exposure
    
    # load image
    img = cv2.imread("lena.jpg")
    
    # convert to grayscale
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # Gaussian blurred gray image
    mean = cv2.GaussianBlur(gray, (0,0), sigmaX=5, sigmaY=5)
    
    # apply median filter to mean image
    median = cv2.medianBlur(mean, 25)
    
    # divide mean by median
    division = cv2.divide(mean.astype(np.float64)/255, median.astype(np.float64)/255)
    
    # get global standard deviation of division
    std = np.std(division)
    print(std)
    
    # divide the division by the std and normalize to range 0 to 255 as unint8
    result = np.divide(division, std)
    result = skimage.exposure.rescale_intensity(result, in_range='image', out_range=(0,255)).astype(np.uint8)
        
    # write result to disk
    cv2.imwrite("lena_std_division2.jpg", result)
    
    # display it
    cv2.imshow("mean", mean)
    cv2.imshow("median", median)
    cv2.imshow("division", division)
    cv2.imshow("result", result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    结果:

    【讨论】:

    • 非常感谢,这正是我想做的,我需要这个过程来检测视网膜图像中的一些病变。
    【解决方案2】:

    我不确定我明白你想要什么。有不同类型的归一化公式。

    最常见的方法是从图像中减去平均值,然后除以标准差。 (I-mean(I))/std(I)

    但是如果你想做你的公式,I/std(I),那么可以这样做:

    输入:

    import cv2
    import numpy as np
    import skimage.exposure
    
    # load image
    img = cv2.imread("lena.jpg")
    
    # convert to grayscale
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY).astype(np.float64)/255
    
    # get local mean from blurred gray image and square it
    sigma=15
    mean = cv2.GaussianBlur(gray, (0,0), sigmaX=sigma, sigmaY=sigma)
    mean_sq = cv2.multiply(mean,mean)
    
    # get mean of gray image squared
    gray2 = cv2.multiply(gray,gray)
    mean2 = cv2.GaussianBlur(gray2, (0,0), sigmaX=sigma, sigmaY=sigma)
    
    # get variance image from the two means
    var = cv2.subtract(mean2, mean_sq)
    
    # get the standard deviation image from the variance image
    std = np.sqrt(var)
    print(std.dtype, np.amax(std), np.amin(std))
    
    # divide image by std and scale using skimage
    divide = (255*cv2.divide(gray, std, scale=1)).clip(0,255).astype(np.uint8)
    divide = skimage.exposure.rescale_intensity(divide, in_range='image', out_range=(0,255)).astype(np.uint8)
    print(divide.dtype, np.amax(divide), np.amin(divide))
    
    # write result to disk
    cv2.imwrite("lena_std_division.jpg", divide)
    
    # display it
    cv2.imshow("std", std)
    cv2.imshow("divide", divide)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    结果(取决于 sigma 值):

    我已经发布了许多示例(称为除法归一化)的替代公式是将图像除以其局部平均图像。 I/mean(I))

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-17
    • 2011-10-30
    • 2016-12-18
    • 2023-03-05
    • 1970-01-01
    • 2017-01-21
    • 2015-09-05
    相关资源
    最近更新 更多