用opencv python获取图像椭圆区域的像素坐标和像素值

14ifxucb  于 2023-01-21  发布在  Python
关注(0)|答案(1)|浏览(294)

我想在python中的opencv图像上画一个任意的椭圆,然后返回两个数组:(1)由椭圆界定的所有像素的像素坐标,既在椭圆线上又在椭圆内,(2)来自阵列(1)的像素中的每一者的像素值。
我查看了这个answer,但它只考虑椭圆轮廓上的点,而不考虑内部区域。

iszxjhcz

iszxjhcz1#

使用以下代码可以获取椭圆内的每个像素:

from math import sin, cos

def get_y_ellipse(ellipse_size, x, alpha):
    a, b = ellipse_size[0] / 2, ellipse_size[1] / 2
    delta_sqrt = ((b**4-2*a**2*b**2+a**4)*sin(2*alpha)**2*x**2-4*a**4*x**2*cos(alpha)**2*sin(alpha)**2-4*a**2*b**2*x**2*cos(alpha)**2+4*a**4*b**2*cos(alpha)**2-4*a**2*b**2*x**2*sin(alpha)**4-4*b**4*x**2*sin(alpha)**2*cos(alpha)**2+4*a**2*b**4*sin(alpha)**2)**(1/2)
    y1 = ((-b**2 + a**2)*sin(2*alpha)*x + delta_sqrt) / (2*a**2*cos(alpha)**2+2*b**2*sin(alpha)**2)
    y2 = ((-b**2 + a**2)*sin(2*alpha)*x - delta_sqrt) / (2*a**2*cos(alpha)**2+2*b**2*sin(alpha)**2)
    return y1, y2

ellipse_size = (100, 50)
ellipse_rotation = 45 # deg
ellipse_center_position = (0,0)

pixels = []

for x in range(ellipse_center_position[0] - ellipse_size[0], ellipse_center_position[0] + ellipse_size[0]):
    y1, y2  = get_y_ellipse(ellipse_size, x, ellipse_rotation)
    if complex not in map(type, (y1, y2)):
        for y in range(int(y1), int(y2), -1):
            pixels.append([x, y])

# 'pixels' is a 1d array that contain every pixel [x,y] format

希望这个有用。

相关问题