我的代码获取图像并计算其平均亮度和标准差。当我在某个数据集 .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,但问题仍然存在。
如果有任何帮助,我将不胜感激。非常感谢。
用我自己拍摄的 8 位图像进行测试后,结果很好。这意味着问题出在读取 16 位图像。
为了确保正确读取图像,我对“original_image”进行了以下更改:
original_image = cv2.imread(image_path, cv2.IMREAD_ANYDEPTH | cv2.IMREAD_UNCHANGED | cv2.IMREAD_ANYCOLOR)