Hướng dẫn opencv python crop rectangle - opencv python crop hình chữ nhật

Làm thế nào tôi có thể cắt hình ảnh, như tôi đã thực hiện trước đây trong PIL, sử dụng OpenCV.

Ví dụ làm việc trên PIL

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

Nhưng làm thế nào tôi có thể làm điều đó trên opencv?

Đây là những gì tôi đã thử:

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)

Nhưng nó không hoạt động.

Tôi nghĩ rằng tôi đã sử dụng không chính xác

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)
8. Nếu đây là trường hợp, vui lòng giải thích làm thế nào tôi có thể sử dụng chính xác chức năng này.

Hướng dẫn opencv python crop rectangle - opencv python crop hình chữ nhật

Seanny123

8.15312 Huy hiệu vàng67 Huy hiệu bạc119 Huy hiệu đồng12 gold badges67 silver badges119 bronze badges

Đã hỏi ngày 23 tháng 3 năm 2013 lúc 17:00Mar 23, 2013 at 17:00

Nó rất đơn giản. Sử dụng cắt lát 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)

opyate

5.3301 Huy hiệu vàng36 Huy hiệu bạc62 Huy hiệu Đồng1 gold badge36 silver badges62 bronze badges

Đã trả lời ngày 23 tháng 3 năm 2013 lúc 17:26Mar 23, 2013 at 17:26

FroyofroyoFroyo

17.3k7 Huy hiệu vàng43 Huy hiệu bạc72 Huy hiệu đồng7 gold badges43 silver badges72 bronze badges

13

Tôi đã có câu hỏi này và tìm thấy một câu trả lời khác ở đây: Sao chép vùng quan tâm

Nếu chúng ta xem xét (0,0) là góc trên cùng bên trái của hình ảnh được gọi là

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)
9 với từ trái sang phải là hướng X và từ trên xuống dưới theo hướng y. và chúng ta có (x1, y1) là đỉnh bên trái và (x2, y2) là đỉnh dưới cùng bên phải của một vùng hình chữ nhật trong hình ảnh đó, sau đó:

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

Dưới đây là một nguồn tài nguyên toàn diện về lập chỉ mục và cắt mảng numpy có thể cho bạn biết thêm về những thứ như cắt một phần của hình ảnh. Hình ảnh sẽ được lưu trữ dưới dạng một mảng numpy trong opencv2.

:)

Hugo

26.5k8 Huy hiệu vàng81 Huy hiệu bạc96 Huy hiệu Đồng8 gold badges81 silver badges96 bronze badges

Đã trả lời ngày 29 tháng 5 năm 2013 lúc 20:21May 29, 2013 at 20:21

Hướng dẫn opencv python crop rectangle - opencv python crop hình chữ nhật

samkhan13samkhan13samkhan13

3.2252 huy hiệu vàng32 Huy hiệu bạc54 Huy hiệu đồng2 gold badges32 silver badges54 bronze badges

4

Mã này trồng một hình ảnh từ x = 0, y = 0 đến h = 100, w = 200.

import numpy as np
import cv2

image = cv2.imread('download.jpg')
y=0
x=0
h=100
w=200
crop = image[y:y+h, x:x+w]
cv2.imshow('Image', crop)
cv2.waitKey(0) 

Đã trả lời ngày 31 tháng 12 năm 2018 lúc 9:44Dec 31, 2018 at 9:44

Hướng dẫn opencv python crop rectangle - opencv python crop hình chữ nhật

m.hatamim.hatamim.hatami

5731 Huy hiệu vàng6 Huy hiệu bạc20 Huy hiệu đồng1 gold badge6 silver badges20 bronze badges

2

Lưu ý rằng, việc cắt hình ảnh không tạo ra một bản sao của

import cv2
img = cv2.imread("lenna.png")
crop_img = img[y:y+h, x:x+w]
cv2.imshow("cropped", crop_img)
cv2.waitKey(0)
0 nhưng tạo ra
import cv2
img = cv2.imread("lenna.png")
crop_img = img[y:y+h, x:x+w]
cv2.imshow("cropped", crop_img)
cv2.waitKey(0)
1 cho
import cv2
img = cv2.imread("lenna.png")
crop_img = img[y:y+h, x:x+w]
cv2.imshow("cropped", crop_img)
cv2.waitKey(0)
2. Nếu bạn đang tải rất nhiều hình ảnh, cắt các phần có liên quan của hình ảnh với việc cắt, sau đó nối vào một danh sách, đây có thể là một chất thải bộ nhớ lớn.

Giả sử bạn tải n hình ảnh mỗi hình ảnh là

import cv2
img = cv2.imread("lenna.png")
crop_img = img[y:y+h, x:x+w]
cv2.imshow("cropped", crop_img)
cv2.waitKey(0)
3 và bạn chỉ cần
import cv2
img = cv2.imread("lenna.png")
crop_img = img[y:y+h, x:x+w]
cv2.imshow("cropped", crop_img)
cv2.waitKey(0)
4 vùng từ góc trên bên trái.

import cv2
img = cv2.imread("lenna.png")
crop_img = img[y:y+h, x:x+w]
cv2.imshow("cropped", crop_img)
cv2.waitKey(0)
5:

X = []
for i in range(N):
    im = imread('image_i')
    X.append(im[0:100,0:100]) # This will keep all N images in the memory. 
                              # Because they are still used.

Ngoài ra, bạn có thể sao chép phần có liên quan bằng

import cv2
img = cv2.imread("lenna.png")
crop_img = img[y:y+h, x:x+w]
cv2.imshow("cropped", crop_img)
cv2.waitKey(0)
6, vì vậy người thu gom rác sẽ loại bỏ
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)
9.

X = []
for i in range(N):
    im = imread('image_i')
    X.append(im[0:100,0:100].copy()) # This will keep only the crops in the memory. 
                                     # im's will be deleted by gc.

Sau khi tìm hiểu điều này, tôi đã nhận ra một trong những bình luận của User1270710 đã đề cập rằng nhưng tôi phải mất một thời gian để tìm hiểu (tức là, gỡ lỗi, v.v.). Vì vậy, tôi nghĩ rằng nó có giá trị đề cập.

Đã trả lời ngày 27 tháng 11 năm 2018 lúc 10:03Nov 27, 2018 at 10:03

smttspsmttspsmttsp

3,8613 huy hiệu vàng32 huy hiệu bạc60 huy hiệu đồng3 gold badges32 silver badges60 bronze badges

3

Cây trồng mạnh mẽ với chức năng đường viền sao chép opencv:

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 = cv2.copyMakeBorder(img, - min(0, y1), max(y2 - img.shape[0], 0),
                            -min(0, x1), max(x2 - img.shape[1], 0),cv2.BORDER_REPLICATE)
   y2 += -min(0, y1)
   y1 += -min(0, y1)
   x2 += -min(0, x1)
   x1 += -min(0, x1)
   return img, x1, x2, y1, y2

Đã trả lời ngày 21 tháng 6 năm 2018 lúc 7:26Jun 21, 2018 at 7:26

2

Đây là một số mã cho IMCROP mạnh mẽ hơn (hơi giống trong 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

Đã trả lời ngày 23 tháng 4 năm 2018 lúc 14:09Apr 23, 2018 at 14:09

Hướng dẫn opencv python crop rectangle - opencv python crop hình chữ nhật

Dan Erezdan ErezDan Erez

1.26415 huy hiệu bạc15 huy hiệu đồng15 silver badges15 bronze badges

1

Dưới đây là cách để cắt một hình ảnh.

Image_path: Đường dẫn đến hình ảnh để chỉnh sửa The path to the image to edit

Phối hợp: Một bộ tọa độ X/Y (X1, Y1, X2, Y2) [Mở hình ảnh trong MSPAINT và kiểm tra "Người cai trị" trong tab Xem để xem tọa độ] A tuple of x/y coordinates (x1, y1, x2, y2)[open the image in mspaint and check the "ruler" in view tab to see the coordinates]

Đã lưu_location: Đường dẫn để lưu hình ảnh bị cắt: Path to save the cropped image

from PIL import Image
    def crop(image_path, coords, saved_location:
        image_obj = Image.open("Path of the image to be cropped")
            cropped_image = image_obj.crop(coords)
            cropped_image.save(saved_location)
            cropped_image.show()


if __name__ == '__main__':
    image = "image.jpg"
    crop(image, (100, 210, 710,380 ), 'cropped.jpg')

Đã trả lời ngày 17 tháng 4 năm 2019 lúc 5:29Apr 17, 2019 at 5:29

SanyalsanyalSanyal

83410 Huy hiệu bạc22 Huy hiệu đồng10 silver badges22 bronze badges

0

Để làm cho bạn dễ dàng hơn ở đây là mã mà tôi sử dụng:

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)
0

Hướng dẫn opencv python crop rectangle - opencv python crop hình chữ nhật

Đã trả lời ngày 12 tháng 11 năm 2020 lúc 19:48Nov 12, 2020 at 19:48

Ngoài ra, bạn có thể sử dụng tenorflow để cắt xén và opencv để tạo một mảng từ hình ảnh.

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)
1

Bây giờ

import cv2
img = cv2.imread("lenna.png")
crop_img = img[y:y+h, x:x+w]
cv2.imshow("cropped", crop_img)
cv2.waitKey(0)
8 là một mảng hình dạng (ImageHeight, ImageWidth, 3). Cắt mảng bằng tenorflow:

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)
2

Lắp lại hình ảnh với TF.Keras, vì vậy chúng ta có thể xem xét nó nếu nó hoạt động:

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)
3

Điều này in ra pic trong một cuốn sổ (được thử nghiệm trong Google Colab).


Toàn bộ mã cùng nhau:

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)
4

Đã trả lời ngày 31 tháng 3 năm 2020 lúc 11:02Mar 31, 2020 at 11:02

Hướng dẫn opencv python crop rectangle - opencv python crop hình chữ nhật

Zabopzabopzabop

5.9493 Huy hiệu vàng28 Huy hiệu bạc67 Huy hiệu Đồng3 gold badges28 silver badges67 bronze badges

để cắt hoặc khu vực quan tâm (ROI) để sử dụng khuôn mặt dưới đây mã

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)
5

Kiểm tra để tham khảo

Đã trả lời ngày 18 tháng 7 năm 2021 lúc 5:15Jul 18, 2021 at 5:15

Hướng dẫn opencv python crop rectangle - opencv python crop hình chữ nhật

Bằng cách sử dụng chức năng này, bạn có thể dễ dàng cắt hình ảnh

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)
6

HI VỌNG ĐIÊU NAY CO ICH

Đã trả lời ngày 2 tháng 6 năm 2021 lúc 6:18Jun 2, 2021 at 6:18

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)
7

Hướng dẫn opencv python crop rectangle - opencv python crop hình chữ nhật

Suraj Rao

29.2k11 Huy hiệu vàng96 Huy hiệu bạc103 Huy hiệu đồng11 gold badges96 silver badges103 bronze badges

Đã trả lời ngày 7 tháng 12 năm 2021 lúc 14:38Dec 7, 2021 at 14:38

Hướng dẫn opencv python crop rectangle - opencv python crop hình chữ nhật