343

以前に PIL で行ったように、OpenCV を使用して画像をトリミングするにはどうすればよいですか。

PIL での作業例

im = Image.open('0.png').convert('L')
im = im.crop((1, 1, 98, 33))
im.save('_0.png')

しかし、どうすればOpenCVでそれを行うことができますか?

これは私が試したものです:

im = cv.imread('0.png', cv.CV_LOAD_IMAGE_GRAYSCALE)
(thresh, im_bw) = cv.threshold(im, 128, 255, cv.THRESH_OTSU)
im = cv.getRectSubPix(im_bw, (98, 33), (1, 1))
cv.imshow('Img', im)
cv.waitKey(0)

しかし、うまくいきません。

を間違って使用したと思いますgetRectSubPix。この場合、この機能を正しく使用する方法を説明してください。

4

12 に答える 12

726

とても簡単です。numpy スライスを使用します。

import cv2
img = cv2.imread("lenna.png")
crop_img = img[y:y+h, x:x+w]
cv2.imshow("cropped", crop_img)
cv2.waitKey(0)
于 2013-03-23T17:26:58.580 に答える
153

私はこの質問をして、ここで別の答えを見つけました:興味のある領域をコピー

(0,0) を画像の左上隅と見なすとim、左から右が x 方向、上から下が y 方向となります。そして、その画像内の長方形領域の左上の頂点として (x1,y1) と右下の頂点として (x2,y2) があるとします。

roi = im[y1:y2, x1:x2]

これは、 numpy 配列のインデックス作成とスライスに関する包括的なリソースであり、画像の一部のトリミングなどについて詳しく説明しています。画像は、opencv2 で numpy 配列として保存されます。

:)

于 2013-05-29T20:21:12.630 に答える
5

これは、より堅牢な imcrop のコードです (matlab のようなものです)。

def imcrop(img, bbox): 
    x1,y1,x2,y2 = bbox
    if x1 < 0 or y1 < 0 or x2 > img.shape[1] or y2 > img.shape[0]:
        img, x1, x2, y1, y2 = pad_img_to_fit_bbox(img, x1, x2, y1, y2)
    return img[y1:y2, x1:x2, :]

def pad_img_to_fit_bbox(img, x1, x2, y1, y2):
    img = np.pad(img, ((np.abs(np.minimum(0, y1)), np.maximum(y2 - img.shape[0], 0)),
               (np.abs(np.minimum(0, x1)), np.maximum(x2 - img.shape[1], 0)), (0,0)), mode="constant")
    y1 += np.abs(np.minimum(0, y1))
    y2 += np.abs(np.minimum(0, y1))
    x1 += np.abs(np.minimum(0, x1))
    x2 += np.abs(np.minimum(0, x1))
    return img, x1, x2, y1, y2
于 2018-04-23T14:09:13.537 に答える
0

簡単にするために、私が使用するコードは次のとおりです。

    top=514
    right=430
    height= 40
    width=100
    croped_image = image[top : (top + height) , right: (right + width)]
    plt.imshow(croped_image, cmap="gray")
    plt.show()
于 2020-11-12T19:48:11.523 に答える