Hướng dẫn crop region of interest opencv python - cắt vùng quan tâm opencv python

Trong hướng dẫn này, bạn sẽ học cách cắt hình ảnh bằng OpenCV.

Hướng dẫn crop region of interest opencv python - cắt vùng quan tâm opencv python

Như tên cho thấy, cắt xén là hành động lựa chọn và trích xuất khu vực quan tâm (hoặc đơn giản là ROI) và là một phần của hình ảnh mà chúng tôi quan tâm.cropping is the act of selecting and extracting the Region of Interest (or simply, ROI) and is the part of the image in which we are interested.

Ví dụ, trong một ứng dụng phát hiện khuôn mặt, chúng ta có thể muốn cắt khuôn mặt từ một hình ảnh. Và nếu chúng ta đang phát triển một kịch bản Python để nhận ra những con chó trong hình ảnh, chúng ta có thể muốn cắt chó từ hình ảnh một khi chúng ta đã tìm thấy nó.

Chúng tôi đã sử dụng cắt xén trong hướng dẫn của chúng tôi, nhận và thiết lập các pixel với OpenCV, nhưng chúng tôi sẽ xem xét lại để hoàn thiện hơn.

Để tìm hiểu cách cắt hình ảnh với OpenCV, chỉ cần tiếp tục đọc.

Trong phần đầu tiên của hướng dẫn này, chúng tôi sẽ thảo luận về cách chúng tôi đại diện cho các hình ảnh OpenCV dưới dạng các mảng numpy. Vì mỗi hình ảnh là một mảng numpy, chúng ta có thể tận dụng các mảng numpy để cắt một hình ảnh.

Từ đó, chúng tôi sẽ định cấu hình môi trường phát triển của chúng tôi và xem xét cấu trúc thư mục dự án của chúng tôi.

Sau đó, tôi sẽ chứng minh rằng nó đơn giản như thế nào khi cắt hình ảnh với OpenCV!

Hiểu về việc cắt hình ảnh với opencv và cắt mảng numpy

Hướng dẫn crop region of interest opencv python - cắt vùng quan tâm opencv python
Hình 1: Chúng tôi hoàn thành việc cắt xén hình ảnh bằng cách sử dụng cắt mảng numpy (nguồn hình ảnh). We accomplish image cropping by using NumPy array slicing (image source).

Khi chúng tôi cắt một hình ảnh, chúng tôi muốn loại bỏ các phần bên ngoài của hình ảnh mà chúng tôi không quan tâm. Chúng tôi thường gọi quá trình này là chọn khu vực quan tâm của chúng tôi, hoặc đơn giản hơn là ROI của chúng tôi.

Chúng ta có thể hoàn thành việc cắt xén hình ảnh bằng cách sử dụng cắt mảng numpy.

Hãy bắt đầu bằng cách khởi tạo một danh sách numpy với các giá trị từ [0, 24]:

>>> import numpy as np
>>> I = np.arange(0, 25)
>>> I
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
       15, 16, 17, 18, 19, 20, 21, 22, 23, 24])
>>> 

Và bây giờ, hãy để định hình lại danh sách 1D này thành ma trận 2D, giả vờ rằng đó là một hình ảnh:

>>> I = I.reshape((5, 5))
>>> I
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
>>> 

Bây giờ, hãy để Giả sử tôi muốn trích xuất các pixel pixel bắt đầu tại x = 0, y = 0 và kết thúc tại x = 2, y = 3. Có thể thực hiện bằng cách sử dụng mã sau:

>>> I[0:3, 0:2]
array([[ 0,  1],
       [ 5,  6],
       [10, 11]])
>>> 

Lưu ý cách chúng tôi đã trích xuất ba hàng (y = 3) và hai cột (x = 2).

Bây giờ, hãy để trích xuất các pixel bắt đầu từ x = 1, y = 3 và kết thúc tại x = 5 và y = 5:

>>> I[3:5, 1:5]
array([[16, 17, 18, 19],
       [21, 22, 23, 24]])
>>>

Kết quả này cung cấp hai hàng cuối cùng của hình ảnh, trừ cột đầu tiên.

Bạn có nhận thấy một mô hình ở đây?

Khi áp dụng cắt mảng numpy vào hình ảnh, chúng tôi trích xuất ROI bằng cú pháp sau:

>>> I = I.reshape((5, 5))
>>> I
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
>>> 
0

Đụ ____11 cung cấp các hàng của chúng tôi (vì trục y là số lượng hàng của chúng tôi) trong khi

>>> I = I.reshape((5, 5))
>>> I
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
>>> 
2 cung cấp các cột của chúng tôi (vì trục X là số lượng cột) trong hình ảnh. Hãy dành một giây bây giờ để thuyết phục bản thân rằng tuyên bố trên là đúng.

Nhưng nếu bạn bối rối hơn một chút và cần thuyết phục hơn, đừng lo lắng! Tôi sẽ chỉ cho bạn một số ví dụ mã sau trong hướng dẫn này để làm cho việc cắt hình ảnh với OpenCV rõ ràng và cụ thể hơn cho bạn.

Định cấu hình môi trường phát triển của bạn

Để làm theo hướng dẫn này, bạn cần cài đặt thư viện OpenCV trên hệ thống của bạn.

May mắn thay, OpenCV không thể cài đặt được:

$ pip install opencv-contrib-python

Nếu bạn cần trợ giúp định cấu hình môi trường phát triển của mình cho OpenCV, tôi khuyên bạn nên đọc hướng dẫn OpenCV cài đặt PIP của tôi - nó sẽ giúp bạn và chạy trong vài phút.pip install OpenCV guide — it will have you up and running in a matter of minutes.

Có vấn đề cấu hình môi trường phát triển của bạn?

Hướng dẫn crop region of interest opencv python - cắt vùng quan tâm opencv python
Hình 2: Gặp khó khăn trong việc cấu hình môi trường phát triển của bạn? Bạn muốn truy cập vào các máy tính xách tay Jupyter được cấu hình sẵn chạy trên Google Colab? Hãy chắc chắn tham gia PyimageSearch Plus - bạn sẽ lên và chạy với hướng dẫn này trong vài phút.Having trouble configuring your development environment? Want access to pre-configured Jupyter Notebooks running on Google Colab? Be sure to join PyImageSearch Plus — you will be up and running with this tutorial in a matter of minutes.

Tất cả những gì đã nói, là bạn:

  • Ngắn gọn về thời gian?
  • Học trên hệ thống bị khóa hành chính của nhà tuyển dụng?
  • Muốn bỏ qua những rắc rối khi chiến đấu với dòng lệnh, người quản lý gói và môi trường ảo?
  • Sẵn sàng để chạy mã ngay bây giờ trên hệ thống Windows, MacOS hoặc Linux của bạn?right now on your Windows, macOS, or Linux system?

Sau đó tham gia PyimageSearch Plus ngay hôm nay!

Có quyền truy cập vào các máy tính xách tay Jupyter cho hướng dẫn này và các hướng dẫn PyimageSearch khác được cấu hình sẵn để chạy trên hệ sinh thái Google Colab, ngay trong trình duyệt web của bạn! Không cần cài đặt. No installation required.

Và tốt nhất, những máy tính xách tay Jupyter này sẽ chạy trên Windows, MacOS và Linux!

Cấu trúc dự án

Trước khi chúng tôi có thể thực hiện cắt hình ảnh với OpenCV, trước tiên hãy xem xét cấu trúc thư mục dự án của chúng tôi.

Bắt đầu bằng cách sử dụng phần Tải xuống của Hướng dẫn này trong hướng dẫn này để truy cập mã nguồn và hình ảnh ví dụ:“Downloads” section of this guide to access the source code and example images:

$ tree . --dirsfirst
.
├── adrian.png
└── opencv_crop.py

0 directories, 2 files

Chúng tôi chỉ có một tập lệnh Python duy nhất để xem xét ngày hôm nay,

>>> I = I.reshape((5, 5))
>>> I
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
>>> 
3, sẽ tải hình ảnh đầu vào
>>> I = I.reshape((5, 5))
>>> I
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
>>> 
4 từ đĩa và sau đó cắt mặt và cơ thể từ hình ảnh bằng cách sử dụng cắt mảng numpy.

Thực hiện cắt hình ảnh với OpenCV

Bây giờ chúng tôi đã sẵn sàng để thực hiện cắt hình ảnh với OpenCV.

Mở tệp

>>> I = I.reshape((5, 5))
>>> I
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
>>> 
3 trong cấu trúc thư mục dự án của bạn và chèn mã sau:

# import the necessary packages
import argparse
import cv2

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", type=str, default="adrian.png",
	help="path to the input image")
args = vars(ap.parse_args())

Dòng 2 và 3 Nhập các gói Python yêu cầu của chúng tôi trong khi các dòng 6-9 phân tích các đối số dòng lệnh của chúng tôi.import our required Python packages while Lines 6-9 parse our command line arguments.

Chúng ta chỉ cần một đối số dòng lệnh,

>>> I = I.reshape((5, 5))
>>> I
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
>>> 
6, đó là đường dẫn đến hình ảnh đầu vào mà chúng ta muốn cắt. Đối với ví dụ này, chúng tôi sẽ mặc định chuyển đổi
>>> I = I.reshape((5, 5))
>>> I
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
>>> 
6 sang tệp
>>> I = I.reshape((5, 5))
>>> I
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
>>> 
4 trong thư mục dự án của chúng tôi.

Tiếp theo, hãy để tải hình ảnh của chúng tôi từ đĩa:

# load the input image and display it to our screen
image = cv2.imread(args["image"])
cv2.imshow("Original", image)

# cropping an image with OpenCV is accomplished via simple NumPy
# array slices in startY:endY, startX:endX order -- here we are
# cropping the face from the image (these coordinates were
# determined using photo editing software such as Photoshop,
# GIMP, Paint, etc.)
face = image[85:250, 85:220]
cv2.imshow("Face", face)
cv2.waitKey(0)

Các dòng 12 và 13 Tải

>>> I = I.reshape((5, 5))
>>> I
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
>>> 
9 ban đầu của chúng tôi và sau đó hiển thị nó lên màn hình của chúng tôi: load our original
>>> I = I.reshape((5, 5))
>>> I
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
>>> 
9 and then display it to our screen:

Hướng dẫn crop region of interest opencv python - cắt vùng quan tâm opencv python
Hình 3: Hình ảnh đầu vào ban đầu mà chúng ta sẽ cắt xén bằng OpenCV. The original input image that we will be cropping using OpenCV.

Mục tiêu của chúng tôi ở đây là trích xuất khuôn mặt và cơ thể của tôi từ khu vực bằng cách sử dụng các phương pháp cắt xén đơn giản.

Thông thường chúng tôi sẽ áp dụng các kỹ thuật phát hiện đối tượng để phát hiện khuôn mặt và cơ thể của tôi trong hình ảnh. Tuy nhiên, vì chúng tôi vẫn còn khá sớm trong khóa học giáo dục OpenCV, chúng tôi sẽ sử dụng kiến ​​thức tiên nghiệm về hình ảnh và cung cấp thủ công các lát mảng numpy nơi cơ thể và khuôn mặt cư trú.

Một lần nữa, tất nhiên, chúng ta có thể sử dụng các phương pháp phát hiện đối tượng để phát hiện và trích xuất các khuôn mặt từ hình ảnh tự động, nhưng trong thời điểm hiện tại, hãy để Lôi giữ mọi thứ đơn giản.

Chúng tôi trích xuất khuôn mặt của tôi từ hình ảnh trên một dòng mã (dòng 20).Line 20).

Chúng tôi đang cung cấp các lát mảng numpy để trích xuất một vùng hình chữ nhật của hình ảnh, bắt đầu từ (85, 85) và kết thúc tại (220, 250).

Thứ tự chúng tôi cung cấp các chỉ số cho vụ mùa có vẻ trái ngược; Tuy nhiên, hãy nhớ rằng OpenCV đại diện cho hình ảnh dưới dạng các mảng numpy với chiều cao trước tiên (# của các hàng) và chiều rộng thứ hai (# của các cột).

Để thực hiện việc cắt xén của chúng tôi, Numpy mong đợi bốn chỉ số:

  • Bắt đầu Y: Tọa độ Y bắt đầu. Trong trường hợp này, chúng tôi bắt đầu tại y = 85. The starting y-coordinate. In this case, we start at y = 85.
  • Kết thúc Y: Tọa độ Y kết thúc. Chúng tôi sẽ kết thúc vụ mùa của chúng tôi tại y = 250.: The ending y-coordinate. We will end our crop at y = 250.
  • Bắt đầu X: Tọa độ X bắt đầu của lát cắt. Chúng tôi bắt đầu vụ mùa tại x = 85. The starting x-coordinate of the slice. We start the crop at x = 85.
  • Kết thúc X: Tọa độ trục X kết thúc của lát cắt. Cắt lát của chúng tôi kết thúc tại x = 220.: The ending x-axis coordinate of the slice. Our slice ends at x = 220.

Chúng ta có thể thấy kết quả của việc cắt khuôn mặt của tôi dưới đây:

Hướng dẫn crop region of interest opencv python - cắt vùng quan tâm opencv python
Hình 4: Cắt khuôn mặt bằng OpenCV.: Cropping the face using OpenCV.

Tương tự, chúng ta có thể cắt cơ thể của tôi từ hình ảnh:

# apply another image crop, this time extracting the body
body = image[90:450, 0:290]
cv2.imshow("Body", body)
cv2.waitKey(0)

Cây trồng cơ thể tôi được thực hiện bằng cách bắt đầu cây trồng từ tọa độ (0, 90) và kết thúc tại (290, 450) của hình ảnh gốc.

Dưới đây bạn có thể thấy đầu ra của cắt xén với OpenCV:

Hướng dẫn crop region of interest opencv python - cắt vùng quan tâm opencv python
Hình 5: Cắt cơ thể từ hình ảnh bằng OpenCV. Cropping the body from the image using OpenCV.

Mặc dù đơn giản, cắt xén là một kỹ năng cực kỳ quan trọng mà chúng tôi sẽ sử dụng trong suốt loạt bài này. Nếu bạn vẫn cảm thấy khó chịu với việc cắt xén, chắc chắn sẽ dành thời gian để thực hành ngay bây giờ và trau dồi kỹ năng của bạn. Từ đây trở đi, cắt xén sẽ là một kỹ năng giả định mà bạn sẽ cần phải hiểu!

Kết quả cắt hình ảnh OpenCV

Để cắt hình ảnh với OpenCV, hãy chắc chắn rằng bạn đã đi đến phần Tải xuống của các bản tải xuống của hướng dẫn này để truy cập vào mã nguồn và hình ảnh ví dụ.“Downloads” section of this tutorial to access the source code and example images.

Từ đó, mở shell và thực hiện lệnh sau:

$ python opencv_crop.py

Sản lượng cắt của bạn sẽ phù hợp với tôi từ phần trước.

Cái gì tiếp theo? Tôi đề nghị Đại học Pyimageearch.

Thông tin khóa học: 57+ Tổng số lớp • 60 giờ video theo yêu cầu của các video • Cập nhật lần cuối: Tháng 11 năm 2022
57+ total classes • 60+ hours of on-demand code walkthrough videos • Last updated: Nov 2022
★★★★★ 4.84 (128 Ratings) • 15,800+ Students Enrolled

Tôi tin tưởng mạnh mẽ rằng nếu bạn có một giáo viên phù hợp, bạn có thể làm chủ tầm nhìn máy tính và học sâu.

Bạn có nghĩ rằng việc học tầm nhìn máy tính và học tập sâu phải tốn thời gian, quá sức và phức tạp? Hoặc phải liên quan đến toán học và phương trình phức tạp? Hoặc yêu cầu bằng cấp về khoa học máy tính?

Đó không phải là trường hợp.

Tất cả những gì bạn cần để làm chủ tầm nhìn máy tính và học tập sâu là để ai đó giải thích mọi thứ với bạn bằng các thuật ngữ đơn giản, trực quan. Và đó chính xác là những gì tôi làm. Nhiệm vụ của tôi là thay đổi giáo dục và các chủ đề trí tuệ nhân tạo phức tạp được dạy như thế nào.

Nếu bạn nghiêm túc về việc học tầm nhìn máy tính, điểm dừng tiếp theo của bạn sẽ là Đại học Pyimageearch, tầm nhìn máy tính toàn diện nhất, học sâu và khóa học OpenCV trực tuyến ngày hôm nay. Tại đây, bạn sẽ học cách áp dụng thành công và tự tin tầm nhìn máy tính vào công việc, nghiên cứu và dự án của bạn. Tham gia với tôi trong Mastery Mastery Mastery.

Bên trong Đại học Pyimageearch, bạn sẽ tìm thấy:

  • ✓ Hơn 53 khóa học về tầm nhìn máy tính thiết yếu, học tập sâu và chủ đề OpenCV53+ courses on essential computer vision, deep learning, and OpenCV topics
  • ✓ 53+ Giấy chứng nhận hoàn thành53+ Certificates of Completion
  • ✓ Hơn 57 giờ video theo yêu cầu57+ hours of on-demand video
  • ✓ Các khóa học hoàn toàn mới được phát hành thường xuyên, đảm bảo bạn có thể theo kịp các kỹ thuật tiên tiếnBrand new courses released regularly, ensuring you can keep up with state-of-the-art techniques
  • ✓ Sổ tay Jupyter được cấu hình sẵn trong Google ColabPre-configured Jupyter Notebooks in Google Colab
  • ✓ Chạy tất cả các ví dụ mã trong trình duyệt web của bạn - hoạt động trên Windows, MacOS và Linux (không yêu cầu cấu hình môi trường Dev!)
  • ✓ Truy cập vào các repos mã tập trung cho tất cả hơn 450 hướng dẫn về pyimageearchcentralized code repos for all 450+ tutorials on PyImageSearch
  • ✓ Dễ dàng tải xuống một lần nhấp cho mã, bộ dữ liệu, mô hình được đào tạo trước, v.v. Easy one-click downloads for code, datasets, pre-trained models, etc.
  • ✓ Truy cập trên thiết bị di động, máy tính xách tay, máy tính để bàn, v.v.Access on mobile, laptop, desktop, etc.

Bấm vào đây để tham gia Đại học Pyimageearch

Bản tóm tắt

Trong hướng dẫn này, bạn đã học cách cắt một hình ảnh bằng OpenCV. Vì OpenCV đại diện cho hình ảnh như các mảng numpy, nên việc cắt xén cũng đơn giản như cung cấp các loại bắt đầu và kết thúc của cây trồng như một lát mảng numpy.

Tất cả những gì bạn cần làm là nhớ cú pháp sau:

>>> I[0:3, 0:2]
array([[ 0,  1],
       [ 5,  6],
       [10, 11]])
>>> 
0

Miễn là bạn nhớ thứ tự để cung cấp cho các kết thúc và kết thúc (x, y), hình ảnh cắt xén với opencv là một làn gió!

Để tải xuống mã nguồn cho bài đăng này (và được thông báo khi các hướng dẫn trong tương lai được xuất bản tại đây trên PyimageSearch), chỉ cần nhập địa chỉ email của bạn trong biểu mẫu bên dưới!

Hướng dẫn crop region of interest opencv python - cắt vùng quan tâm opencv python

Tải xuống mã nguồn và hướng dẫn tài nguyên 17 trang miễn phí

Nhập địa chỉ email của bạn dưới đây để nhận .Zip của mã và hướng dẫn tài nguyên 17 trang miễn phí về tầm nhìn máy tính, openCV và học sâu. Bên trong bạn sẽ tìm thấy các hướng dẫn, sách, khóa học và thư viện được chọn bằng tay của tôi để giúp bạn thành thạo CV và DL!FREE 17-page Resource Guide on Computer Vision, OpenCV, and Deep Learning. Inside you'll find my hand-picked tutorials, books, courses, and libraries to help you master CV and DL!


Khu vực quan tâm đến OpenCV là gì?

Đôi khi, một chức năng xử lý chỉ cần được áp dụng cho một phần của hình ảnh.OpenCV kết hợp một cơ chế thanh lịch và đơn giản để xác định tiểu vùng trong một hình ảnh và thao tác nó như một hình ảnh thông thường.Công thức này sẽ dạy bạn cách xác định một khu vực quan tâm bên trong một hình ảnh.define a subregion in an image and manipulate it as a regular image. This recipe will teach you how to define a region of interest inside an image.

ROI X1 là gì?

Chiều cao: Chiều cao của hình ảnh với số lượng pixel.ROI.X1: Tọa độ X phía trên của hộp giới hạn.ROI.Y1: tọa độ Y trên bên trái của hộp giới hạn.Upper left X-coordinate of the bounding box. Roi. Y1 : Upper left Y-coordinate of the bounding box.

ROI Opencv là gì?

Để tách một phần cụ thể khỏi hình ảnh, chúng ta phải xác định vị trí khu vực trước. Sau đó chúng ta phải sao chép khu vực đó từ hình ảnh chính sang ma trận khác.Đây là cách ROI trong OpenCV hoạt động. Then we have to copy that area from the main image to another matrix. This is how the ROI in OpenCV works.