42

形状を作成する一連の点があります(閉じたポリライン)。次に、このシェイプ内の一部の画像からすべてのピクセルをコピー/トリミングし、残りを黒/透明のままにします。どうすればよいですか?

たとえば、私はこれを持っています:

ここに画像の説明を入力してください

そして私はこれを手に入れたい:

ここに画像の説明を入力してください

4

2 に答える 2

65

*編集-アルファチャネルを持つ画像で動作するように更新されました。

これは私のために働いた:

  • すべて黒でマスクを作成します(すべてマスクされています)
  • ROIの形でポリゴンを白で塗りつぶします
  • マスクと画像を組み合わせて、他のすべての場所でROIを黒にします

マスクを受け入れる関数では、画像とマスクを別々にしたいと思うかもしれません。ただし、これはあなたが具体的に求めたことを実行すると思います。

import cv2
import numpy as np

# original image
# -1 loads as-is so if it will be 3 or 4 channel as the original
image = cv2.imread('image.png', -1)
# mask defaulting to black for 3-channel and transparent for 4-channel
# (of course replace corners with yours)
mask = np.zeros(image.shape, dtype=np.uint8)
roi_corners = np.array([[(10,10), (300,300), (10,300)]], dtype=np.int32)
# fill the ROI so it doesn't get wiped out when the mask is applied
channel_count = image.shape[2]  # i.e. 3 or 4 depending on your image
ignore_mask_color = (255,)*channel_count
cv2.fillPoly(mask, roi_corners, ignore_mask_color)
# from Masterfool: use cv2.fillConvexPoly if you know it's convex

# apply the mask
masked_image = cv2.bitwise_and(image, mask)

# save the result
cv2.imwrite('image_masked.png', masked_image)
于 2013-03-11T16:00:39.130 に答える
7

次のコードは、画像をトリミングして白い背景にするのに役立ちます。

import cv2
import numpy as np

# load the image
image_path = 'input image path'
image = cv2.imread(image_path)

# create a mask with white pixels
mask = np.ones(image.shape, dtype=np.uint8)
mask.fill(255)

# points to be cropped
roi_corners = np.array([[(0, 300), (1880, 300), (1880, 400), (0, 400)]], dtype=np.int32)
# fill the ROI into the mask
cv2.fillPoly(mask, roi_corners, 0)

# The mask image
cv2.imwrite('image_masked.png', mask)

# applying th mask to original image
masked_image = cv2.bitwise_or(image, mask)

# The resultant image
cv2.imwrite('new_masked_image.png', masked_image)

入力画像: 入力画像

マスク画像: マスク画像

結果の出力画像: ここに画像の説明を入力してください

于 2019-03-04T06:39:17.153 に答える