我有一個影像和它的每一邊的頂點,這意味著,如果我們將每一邊看作一個線段 (A,B) 我有 A 和 B 點坐標。
現在我想裁剪影像,以便我只有影像的一個片段(即側面),例如這只是原始影像的一側
現在我嘗試在opencv中使用二進制掩碼創建一條線(從我擁有的頂點)并使用它來裁剪影像,以便我擁有對應于那一側的像素。這種方法的問題是生成的影像與原始影像的大小相同,但裁剪的所有內容現在都是 [0,0,0,0] (rgba) 像素
相反,我想要的是以下內容:例如,如果我要提取的邊長為 20px,則生成的影像應為 (1,20,4) 1 高、20 寬和 4 個通道 (rgba)
我試著用切片來做,但我不知道如何解釋側面也可以是斜線的事實。
Example image: Example image 對應頂點:[[[107, 32], [95, 30]], [[95, 30], [26, 103]], [[26, 103], [28, 119]] , [[28, 119], [103, 109]], [[103, 109], [122, 64]], [[122, 64], [107, 32]]] 這些頂點中的每一個都是需要的我可以為每 2 個頂點從影像中提取一條線。在前面的示例中,我有 12 個頂點,因此我必須提取 6 行
uj5u.com熱心網友回復:
如果您不需要強制使用 numpy,則可以使用 PIL 中的 Image
from PIL import Image
img1 = Image.open(r"image_name.png")
img1 = img1.crop((cord_x, cord_y, width, height))
img1.save("name_saved.png")
更新: 另一個代碼,矩形形狀的幫助,這里是任何多邊形線陣列的更通用的代碼
import numpy
from PIL import Image, ImageDraw
im = Image.open("image_name").convert("RGBA") #only convert if is necesary
image_array = numpy.asarray(im)
#Create mask
polygon = [(107, 32), (95, 30), (26, 103), (28, 119), (103, 109), (122, 64)] #this cords is from your example
mi = Image.new('L', (image_array.shape[1], image_array.shape[0]), 0)
ImageDraw.Draw(mi).polygon(polygon, outline=1, fill=1)
mask = numpy.array(mi)
new_image_array = numpy.empty(image_array.shape,dtype='uint8')
new_image_array[:,:,:3] = image_array[:,:,:3]
new_image_array[:,:,3] = mask*255
#Convert numpy array to image
image_output = Image.fromarray(new_image_array, "RGBA")
image_output.save("file_output_name")
uj5u.com熱心網友回復:
因此,據我了解您的問題,您似乎可以使用 numpy 切片和蒙版進行裁剪并管理 alpha 通道,但是您需要將該裁剪區域提取為形狀的邊界框?
只要你有定義多邊形的坐標,你就可以找到最左邊、最右邊、最上面和最下面的坐標并對該區域進行切片。
請參閱我對此示例的回答:
查找大小小于 x 的某些顏色的色塊。(x =像素數)
如果您的坐標 = c:
c = [[[107, 32], [95, 30]], [[95, 30], [26, 103]], [[26, 103], [28, 119]], [[28, 119], [103, 109]], [[103, 109], [122, 64]], [[122, 64], [107, 32]]]
然后你會找到類似的極端坐標(假設坐標的格式是 [y,x] 看起來)
top = tuple(c[c[:,:,].argmin()][0]
bottom = tuple(c[c[:,:,].argmax()][0]
left = tuple(c[c[:,:,].argmin()][1]
right = tuple(c[c[:,:,].argmax()][1]
(如果您希望使用更簡單的代碼,您可以以更普通的方式迭代并找到最大/最小值來驗證更復雜的示例。)
你知道在每一邊添加一個像素邊距是否合理,所以left = left - 1,right = right 1,top = top - 1,bottom =bottm 1,但是你必須注意的是新值< 0 或 > 影像的結尾。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/487617.html
上一篇:在Python中,當在groupby([])[].transform(np.sum)中使用np.sum時,我希望NaN總和為NaN而不是零
