gpt4 book ai didi

python - 如何计算不包括圆列表的图像的方差

转载 作者:太空宇宙 更新时间:2023-11-04 11:06:34 24 4
gpt4 key购买 nike

我有一个灰度图像和一个圆圈列表,我正在尝试计算图像的方差,同时排除位于其中一个圆圈内的任何像素。

我当前的实现速度非常慢(遍历图像并检查每个像素是否在其中一个圆圈内)。

我尝试将圆圈设置为图像的均值(以消除它们对方差的影响),但这有不同的结果,因为均值是在原始图像上计算的。

我该怎么做才能让它更高效地运行?

def variance_without_circles(image, circles):
mean = 0
sum_squared = 0
count = 0
for i in range(image.shape[0]):
for j in range(image.shape[1]):
if is_in_circles(circles, i, j):
continue
else:
count += 1
val = image[i, j]
mean += val
sum_squared += val ** 2
mean = mean / count
variance = sum_squared / count - mean ** 2
return variance
def is_in_circles(circles, i, j):
for c in circles[0]:
if (c[0] - j)**2 + (c[1] - i)**2 < (c[2] ** 2):
return True
return False

最佳答案

您可以将所有圆圈绘制到二进制蒙版上,然后使用此蒙版为您的图像编制索引并仅计算输入图像上该切片部分的方差。

例如:

from collections import namedtuple

import cv2
import numpy as np

Circle = namedtuple('Circle', ['cx', 'cy', 'radius'])

image = cv2.imread('lena.png', cv2.IMREAD_COLOR)
print(f'Variance (whole): {np.var(image)}')

circles = [
Circle(cx=45, cy=23, radius=31),
Circle(cx=321, cy=111, radius=89),
Circle(cx=465, cy=511, radius=67)
]

circles_mask = np.full(shape=(image.shape[0], image.shape[1]), fill_value=255, dtype=np.uint8)
for circle in circles:
cv2.circle(circles_mask, (circle.cx, circle.cy), radius=circle.radius,
color=(0, 0, 0), thickness=cv2.FILLED)

image_masked = image[np.where(circles_mask)]
print(f'Variance (masked): {np.var(image_masked)}')

cv2.imshow('image', image)
cv2.imshow('circles_mask', circles_mask)
cv2.waitKey(0)

用于测试的图片:

sample image

圆形 mask :

enter image description here

关于python - 如何计算不包括圆列表的图像的方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59304753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com