计算不同图像的每个像素的平均亮度不一致

问题描述 投票:0回答:1

我的代码获取图像并计算其平均亮度和标准差。当我在某个数据集 .TIF(通常很暗)上运行代码并将运行代码获得的值与 imageJ 中的直方图(我相信它是可靠的来源)进行比较时,我得到相同的值。当我在新数据集 .tiff 上运行它并比较这些值时,亮度非常不同,但标准差是相同的。

我将一个 link 附加到 Google Drive 文件夹,其中包含每个样本中的 2 张图像及其并排的值(白色背景是 ImageJ)。

这是我计算平均亮度和标准差的方法:

import cv2
import numpy as np


def calc_xray_count(image_path):
    original_image = cv2.imread(image_path, cv2.IMREAD_ANYDEPTH)
    median_filtered_image = cv2.medianBlur(original_image, 5)
    median_filtered_image += 1  # Avoid not counting black pixels in image
    pixel_count = np.prod(median_filtered_image.shape)
    img_brightness_sum = np.sum(median_filtered_image)
    img_var = np.var(median_filtered_image)
 
    if (pixel_count > 0):
        img_avg_brightness = (img_brightness_sum/pixel_count) -1 # Subtract back to real data
    else:
        img_avg_brightness = 0
 
    print(f"mean brightness: {img_avg_brightness}")
    print(f"mean std: {np.sqrt(img_var)}")
    return img_avg_brightness, img_var

请注意,我在这里应用了中值滤波器。在比较中,我保存了已经应用中值滤波器的图像。原始图像的 DPI 有所不同(72 与 96),但在应用中值滤波器后,它们都是 96 DPI。尽管如此,这两个图像都是 16 位的。

因为我想计算图像中的黑色像素,所以我临时向图像的像素添加+1,只是为了将它们减去。

我尝试使用不同的库而不是 cv2,但问题仍然存在。

如果有任何帮助,我将不胜感激。非常感谢。

python numpy opencv image-processing imagej
1个回答
0
投票

用我自己拍摄的 8 位图像进行测试后,结果很好。这意味着问题出在读取 16 位图像。

为了确保正确读取图像,我对“original_image”进行了以下更改:

original_image = cv2.imread(image_path, cv2.IMREAD_ANYDEPTH | cv2.IMREAD_UNCHANGED | cv2.IMREAD_ANYCOLOR)
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.