gpt4 book ai didi

python - 将图像分为径向部分并选择单个部分中的值

转载 作者:行者123 更新时间:2023-12-02 18:07:56 26 4
gpt4 key购买 nike

这就是我想在 python 中做的事情:首先,在图像上给出一个特定点(以红色显示),我想将其径向分割成任意给定数量的等距部分。然后我想一次选择每个部分中的像素强度(以蓝色显示)。任何帮助将不胜感激。

enter image description here

最佳答案

不要将背景绘制为白色并用红色或蓝色填充该区域,而是将背景绘制为黑色并用白色填充该区域。然后,您可以使用乘法或按位与来根据扇区掩码选择真实图像中的像素。

现在您只需一次绘制一个扇区,并用白色填充。你知道中心,所以你只需要另外 2 个点来构建三角形。由于任何图像中可能的最长直线是对角线,因此计算其长度。现在,使用它作为从中心发出的每条径向线的长度,您可以使用简单的三角学来计算这两条线,因为您知道它们之间的角度为 360/N,其中 N 是扇区数。不要担心您计算图像边缘之外的两个顶点,所有库都允许您这样做。

这里有一些代码 - 没有经过彻底测试 - 但你明白了:

#!/usr/bin/env python3

import cv2
import math
import numpy as np

h, w = 600, 1200 # image height and width
cx, cy = 200, 300 # (x,y) coordinates of circle centre
N = 16 # number of slices in our pie
l = h + w # length of radial lines - larger than necessary

# Create each sector in white on black background
for sector in range(N):
startAngle = sector * 360/N
endAngle = startAngle + 360/N
x1 = cx + l * math.sin(math.radians(startAngle))
y1 = cy - l * math.cos(math.radians(startAngle))
x2 = cx + l * math.sin(math.radians(endAngle))
y2 = cy - l * math.cos(math.radians(endAngle))
vertices = [(cy, cx), (y1, x1), (y2, x2)]
print(f'DEBUG: sector={sector}, startAngle={startAngle}, endAngle={endAngle}')
# Make empty black canvas
im = np.zeros((h,w), np.uint8)
# Draw this pie slice in white
cv2.fillPoly(im, np.array([vertices],'int32'), 255)
cv2.imwrite(f'DEBUG-{sector:03d}.png', im)
cv2.imshow('title',im)
cv2.waitKey(0)

enter image description here

如果您从这张图片开始:

enter image description here

并将代码更改为:

#!/usr/bin/env python3

import cv2
import math
import numpy as np

orig = cv2.imread('artistic-swirl.jpg', cv2.IMREAD_ANYCOLOR)
print(orig.shape)

h, w = 600, 1200 # image height and width
cx, cy = 200, 300 # (x,y) coordinates of circle centre
N = 16 # number of slices in our pie
l = h + w # length of radial lines - larger than necessary

# Create each sector in white on black background
for sector in range(N):
startAngle = sector * 360/N
endAngle = startAngle + 360/N
x1 = cx + l * math.sin(math.radians(startAngle))
y1 = cy - l * math.cos(math.radians(startAngle))
x2 = cx + l * math.sin(math.radians(endAngle))
y2 = cy - l * math.cos(math.radians(endAngle))
vertices = [(cy, cx), (y1, x1), (y2, x2)]
print(f'DEBUG: sector={sector}, startAngle={startAngle}, endAngle={endAngle}')
# Make empty black canvas
im = np.zeros((h,w), np.uint8)
# Draw this pie slice in white
cv2.fillPoly(im, np.array([vertices],'int32'), 255)
cv2.imwrite(f'DEBUG-{sector:03d}.png', im)
#cv2.imshow('title',im)
#cv2.waitKey(0)
mask = np.dstack((im,im,im))
res = cv2.bitwise_and(mask,orig)
cv2.imshow('image',res)
cv2.waitKey(0)

enter image description here

关于python - 将图像分为径向部分并选择单个部分中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72900640/

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