Trăn sắc ký

Chúng tôi biết rằng nền có màu xanh lá cây và có thể phân biệt với đối tượng bằng màu của nó, vì vậy tôi khuyên bạn nên sử dụng ngưỡng màu. Đối với điều này, tôi đã viết một mã OpenCV Python đơn giản để chứng minh kết quả

Đầu tiên, chúng ta cần cài đặt OpenCV

sudo apt update
pip3 install opencv-python
# verify installation
python3 -c "import cv2; print[cv2.__version__]"

Sau đó, chúng tôi tạo một tập lệnh có tên

for i in range[1, 100]:
    img = imread[str[i] + '.jpg']
3 trong cùng thư mục với các hình ảnh

import cv2
import numpy as np

def show_result[winname, img, wait_time]:
    scale = 0.2
    disp_img = cv2.resize[img, None, fx=scale, fy=scale]
    cv2.imshow[winname, disp_img]
    cv2.waitKey[wait_time]

img = cv2.imread['skull.jpg']
hsv = cv2.cvtColor[img, cv2.COLOR_BGR2HSV]
# define range of green color in HSV
lower_green = np.array[[70, 200, 100]]
upper_green = np.array[[90, 255, 255]]
# Threshold the HSV image to extract green color
mask = cv2.inRange[hsv, lower_green, upper_green]
mask = cv2.bitwise_not[mask]

#cv2.imwrite['mask.png', mask]
show_result['mask', mask, 0]
cv2.destroyAllWindows[]

Bạn có thể dễ dàng tìm thấy hướng dẫn về thao tác màu HSV bằng OpenCV. Tôi sẽ không đi qua các chức năng được sử dụng ở đây, nhưng một phần quan trọng. Các hoạt động hình ảnh thường được thực hiện trong không gian màu RGB, chứa các thành phần màu đỏ, lục và lam. Tuy nhiên, HSV giống hệ thống thị giác của con người hơn, chứa các thành phần màu sắc, độ bão hòa và giá trị. Bạn có thể tìm thấy chuyển đổi ở đây. Vì chúng tôi phân biệt màu sắc dựa trên nhận thức của chúng tôi, HSV phù hợp hơn cho nhiệm vụ này

Phần thiết yếu là chọn các giá trị ngưỡng một cách thích hợp. Tôi đã chọn bằng cách kiểm tra khoảng 80 cho màu sắc [tối đa. 180], và trên 200 và 100 cho độ bão hòa và giá trị [tối đa. 255], tương ứng. Bạn có thể in các giá trị của một pixel cụ thể bằng các dòng sau

rows,cols,channels = hsv.shape
print[hsv[row, column]]

Lưu ý rằng nguồn gốc là góc trên bên trái

Đây là kết quả

Hai điều có thể cần thiết. Một người đang thực hiện thao tác cho một tập hợp các hình ảnh, điều này không quan trọng bằng cách sử dụng các vòng lặp for. Khác là nếu bạn không thích một số phần của kết quả, bạn có thể muốn biết vị trí pixel và thay đổi ngưỡng cho phù hợp. Điều này có thể sử dụng các sự kiện chuột

for i in range[1, 100]:
    img = imread[str[i] + '.jpg']
def mouse_callback[event, x, y, flags, params]:
    if event == cv2.EVENT_LBUTTONDOWN:
        row = y
        column = x
        print[row, column]

winname = 'img'
cv2.namedWindow[winname]
cv2.setMouseCallback[winname, mouse_callback]

Hãy nhớ rằng chức năng

for i in range[1, 100]:
    img = imread[str[i] + '.jpg']
4 thay đổi kích thước hình ảnh theo hệ số tỷ lệ

Nếu bạn không muốn xử lý các vị trí pixel, thay vào đó bạn muốn có kết quả mượt mà, bạn có thể áp dụng các phép biến đổi hình thái. Đặc biệt là mở và đóng sẽ hoàn thành công việc

Trước khi chúng tôi bắt đầu sử dụng khóa Chroma [ hiệu ứng màn hình xanh ], tốt hơn hết là bạn nên hiểu khái niệm cơ bản giúp thực hiện điều đó với Open CV

Ngưỡng màu

Khi chúng tôi coi Hình ảnh là lưới pixel là hàm của X và Y, chúng tôi sẽ sử dụng thông tin về màu sắc đó để cô lập một khu vực cụ thể.

for i in range[1, 100]:
    img = imread[str[i] + '.jpg']
5 chúng ta sẽ chọn một khu vực quan tâm bằng cách sử dụng Ngưỡng màu,

Với Ngưỡng màu, chúng tôi có thể xóa các phần của hình ảnh nằm trong một dải màu cụ thể. Cách sử dụng phổ biến là với Màn hình Xanh lam/Xanh lục

Màn hình xanh lam tương tự như màn hình xanh lá cây được sử dụng để tạo lớp hai luồng hình ảnh hoặc video dựa trên việc xác định và thay thế một vùng màu xanh lam lớn

Bây giờ chúng ta sẽ sử dụng Blue Screen để quay phim ;p. Vì vậy, làm thế nào nó hoạt động?

Bước đầu tiên là tách nền màu xanh lam và thay thế vùng màu xanh lam đó bằng hình ảnh bạn chọn

nguồn. Hoạt hình thô [ctree_bluescreen. jpg]

Chúng ta sẽ bắt đầu với hình ảnh cây thông Noel trên nền màn hình xanh

Trước tiên, chúng tôi phải xác định vùng màu xanh lam, sau đó chúng tôi sẽ thay thế nó bằng hình nền mà chúng tôi chọn

import cv2
import matplotlib.pyplot as plt
import numpy as np
image = cv2.imread['images/ctree_bluescreen.jpg']

for i in range[1, 100]:
    img = imread[str[i] + '.jpg']
6 được sử dụng để đọc một hình ảnh lấy vị trí hình ảnh làm đối số, trong đó hình ảnh
print['Image type: ', type[image],
'Image Dimensions : ', image.shape]
0 nằm trong thư mục có tên
print['Image type: ', type[image],
'Image Dimensions : ', image.shape]
1

print['Image type: ', type[image],
'Image Dimensions : ', image.shape]

Điều này mang lại cho bạn kết quả như

print['Image type: ', type[image],
'Image Dimensions : ', image.shape]
2
print['Image type: ', type[image],
'Image Dimensions : ', image.shape]
3 [720, 1280, 3]

Thư viện openCV đọc hình ảnh dưới dạng một mảng, còn được gọi là lưới hoặc ma trận các giá trị pixel. Hình dạng của hình ảnh, chứa ba giá trị đại diện cho kích thước của mảng hình ảnh,

Chiều cao

print['Image type: ', type[image],
'Image Dimensions : ', image.shape]
4 tính bằng pixel

Chiều rộng

print['Image type: ', type[image],
'Image Dimensions : ', image.shape]
5 tính bằng pixel

print['Image type: ', type[image],
'Image Dimensions : ', image.shape]
6 Thành phần màu cho các giá trị Đỏ, Lục và Lam [RGB]

import cv2
import numpy as np

def show_result[winname, img, wait_time]:
    scale = 0.2
    disp_img = cv2.resize[img, None, fx=scale, fy=scale]
    cv2.imshow[winname, disp_img]
    cv2.waitKey[wait_time]

img = cv2.imread['skull.jpg']
hsv = cv2.cvtColor[img, cv2.COLOR_BGR2HSV]
# define range of green color in HSV
lower_green = np.array[[70, 200, 100]]
upper_green = np.array[[90, 255, 255]]
# Threshold the HSV image to extract green color
mask = cv2.inRange[hsv, lower_green, upper_green]
mask = cv2.bitwise_not[mask]

#cv2.imwrite['mask.png', mask]
show_result['mask', mask, 0]
cv2.destroyAllWindows[]
4

Đầu ra cho đoạn mã trên

CV mở đọc hình ảnh màu dưới dạng hình ảnh BGR [xanh dương, xanh lá cây, đỏ], không phải là RGB [đỏ, xanh dương, xanh lá cây]. Vì vậy, các màu Đỏ và Xanh lam theo thứ tự ngược lại và pyplot phản ánh công tắc này và dẫn đến hình ảnh có màu khác với màu gốc

Vì vậy, trước khi hiển thị hình ảnh, hãy tạo một bản sao của hình ảnh gốc và sử dụng Open CV để thay đổi màu từ BGR sang RGB. Đó là cách tốt để luôn tạo một bản sao của hình ảnh mà bạn đang làm việc với. Bằng cách này, bất kỳ chuyển đổi nào bạn sẽ áp dụng cho bản sao sẽ không ảnh hưởng đến hình ảnh gốc, do đó, việc hoàn tác một bước hoặc thử điều gì đó mới sẽ dễ dàng hơn

Bây giờ, trên hình ảnh được sao chép này

print['Image type: ', type[image],
'Image Dimensions : ', image.shape]
7, chúng ta có thể thực hiện chuyển đổi màu bằng chức năng Open CV
print['Image type: ', type[image],
'Image Dimensions : ', image.shape]
8 , điều này nhận một hình ảnh nguồn và mã chuyển đổi màu, trong trường hợp này, nó chỉ là BGR2RGB và sau đó xuất ra hình ảnh mong muốn

Xác định ngưỡng màu

Bây giờ, chúng ta cần tạo một ngưỡng màu để loại bỏ vùng màu xanh lam mong muốn

Để tạo Ngưỡng màu, chúng ta cần xác định giới hạn dưới và trên cho màu mà chúng ta cần tách và loại bỏ -blue

chúng tôi sẽ sử dụng các giá trị ngưỡng màu để cuối cùng chọn khu vực màn hình xanh chứa phạm vi giá trị màu này và loại bỏ nó

import cv2
import numpy as np

def show_result[winname, img, wait_time]:
    scale = 0.2
    disp_img = cv2.resize[img, None, fx=scale, fy=scale]
    cv2.imshow[winname, disp_img]
    cv2.waitKey[wait_time]

img = cv2.imread['skull.jpg']
hsv = cv2.cvtColor[img, cv2.COLOR_BGR2HSV]
# define range of green color in HSV
lower_green = np.array[[70, 200, 100]]
upper_green = np.array[[90, 255, 255]]
# Threshold the HSV image to extract green color
mask = cv2.inRange[hsv, lower_green, upper_green]
mask = cv2.bitwise_not[mask]

#cv2.imwrite['mask.png', mask]
show_result['mask', mask, 0]
cv2.destroyAllWindows[]
7

Vì vậy, chúng tôi đã xác định ngưỡng thấp chứa các giá trị thấp nhất của màu đỏ, xanh lá cây và xanh dương vẫn được coi là một phần của nền màn hình xanh

Trong

print['Image type: ', type[image],
'Image Dimensions : ', image.shape]
9 , đối với màu đỏ và xanh lục, chúng tôi đặt bằng 0, nghĩa là không có màu đỏ hoặc xanh lá cây cũng không sao. Tuy nhiên, giá trị thấp nhất cho màu xanh lam vẫn khá cao, giả sử khoảng 100

Bây giờ, đối với

import cv2
import numpy as np

def show_result[winname, img, wait_time]:
    scale = 0.2
    disp_img = cv2.resize[img, None, fx=scale, fy=scale]
    cv2.imshow[winname, disp_img]
    cv2.waitKey[wait_time]

img = cv2.imread['skull.jpg']
hsv = cv2.cvtColor[img, cv2.COLOR_BGR2HSV]
# define range of green color in HSV
lower_green = np.array[[70, 200, 100]]
upper_green = np.array[[90, 255, 255]]
# Threshold the HSV image to extract green color
mask = cv2.inRange[hsv, lower_green, upper_green]
mask = cv2.bitwise_not[mask]

#cv2.imwrite['mask.png', mask]
show_result['mask', mask, 0]
cv2.destroyAllWindows[]
40, đã xác định ngưỡng trên để cho phép thêm một chút màu đỏ và xanh lục và đặt giá trị cao nhất cho màu xanh lam thành
import cv2
import numpy as np

def show_result[winname, img, wait_time]:
    scale = 0.2
    disp_img = cv2.resize[img, None, fx=scale, fy=scale]
    cv2.imshow[winname, disp_img]
    cv2.waitKey[wait_time]

img = cv2.imread['skull.jpg']
hsv = cv2.cvtColor[img, cv2.COLOR_BGR2HSV]
# define range of green color in HSV
lower_green = np.array[[70, 200, 100]]
upper_green = np.array[[90, 255, 255]]
# Threshold the HSV image to extract green color
mask = cv2.inRange[hsv, lower_green, upper_green]
mask = cv2.bitwise_not[mask]

#cv2.imwrite['mask.png', mask]
show_result['mask', mask, 0]
cv2.destroyAllWindows[]
41. Bất kỳ màu nào trong phạm vi thấp và cao này sẽ là màu xanh đậm. đây chỉ là một ước tính mặc dù. Vì vậy, nếu chúng tôi thấy rằng phạm vi này không tìm thấy vùng màn hình xanh mà chúng tôi muốn, chúng tôi có thể quay lại và thay đổi các giá trị

Tạo mặt nạ

Chúng ta sẽ sử dụng color bound vừa tạo để tạo image mask

Đeo khẩu trang là cách rất phổ biến để cách ly

import cv2
import numpy as np

def show_result[winname, img, wait_time]:
    scale = 0.2
    disp_img = cv2.resize[img, None, fx=scale, fy=scale]
    cv2.imshow[winname, disp_img]
    cv2.waitKey[wait_time]

img = cv2.imread['skull.jpg']
hsv = cv2.cvtColor[img, cv2.COLOR_BGR2HSV]
# define range of green color in HSV
lower_green = np.array[[70, 200, 100]]
upper_green = np.array[[90, 255, 255]]
# Threshold the HSV image to extract green color
mask = cv2.inRange[hsv, lower_green, upper_green]
mask = cv2.bitwise_not[mask]

#cv2.imwrite['mask.png', mask]
show_result['mask', mask, 0]
cv2.destroyAllWindows[]
42 và làm điều gì đó với khu vực đó. Chúng ta có thể tạo mặt nạ trên vùng màu xanh bằng chức năng Open CV’s
import cv2
import numpy as np

def show_result[winname, img, wait_time]:
    scale = 0.2
    disp_img = cv2.resize[img, None, fx=scale, fy=scale]
    cv2.imshow[winname, disp_img]
    cv2.waitKey[wait_time]

img = cv2.imread['skull.jpg']
hsv = cv2.cvtColor[img, cv2.COLOR_BGR2HSV]
# define range of green color in HSV
lower_green = np.array[[70, 200, 100]]
upper_green = np.array[[90, 255, 255]]
# Threshold the HSV image to extract green color
mask = cv2.inRange[hsv, lower_green, upper_green]
mask = cv2.bitwise_not[mask]

#cv2.imwrite['mask.png', mask]
show_result['mask', mask, 0]
cv2.destroyAllWindows[]
43

rows,cols,channels = hsv.shape
print[hsv[row, column]]
3

Hàm

import cv2
import numpy as np

def show_result[winname, img, wait_time]:
    scale = 0.2
    disp_img = cv2.resize[img, None, fx=scale, fy=scale]
    cv2.imshow[winname, disp_img]
    cv2.waitKey[wait_time]

img = cv2.imread['skull.jpg']
hsv = cv2.cvtColor[img, cv2.COLOR_BGR2HSV]
# define range of green color in HSV
lower_green = np.array[[70, 200, 100]]
upper_green = np.array[[90, 255, 255]]
# Threshold the HSV image to extract green color
mask = cv2.inRange[hsv, lower_green, upper_green]
mask = cv2.bitwise_not[mask]

#cv2.imwrite['mask.png', mask]
show_result['mask', mask, 0]
cv2.destroyAllWindows[]
43 lấy một hình ảnh ở giới hạn màu dưới và trên của chúng tôi và xác định mặt nạ bằng cách hỏi xem giá trị màu của mỗi pixel hình ảnh có nằm trong phạm vi của ngưỡng màu dưới và trên không. Nếu nó nằm trong phạm vi này, mặt nạ sẽ được phép hiển thị và nếu không, nó sẽ chặn nó và biến pixel thành màu đen

Trên thực tế, chúng ta có thể hình dung mặt nạ bằng cách vẽ nó như một hình ảnh

plt. imshow[mặt nạ, cmap=’xám’]

Toàn bộ khu vực màu trắng là nơi hình ảnh sẽ được phép hiển thị và màu đen sẽ bị chặn. Ở dạng số, chúng ta có thể xem mặt nạ này dưới dạng lưới 2D có cùng kích thước với hình ảnh của chúng ta có chiều cao 145 pixel và chiều rộng 146 pixel

Mỗi tọa độ trong mặt nạ có giá trị là 255 cho màu trắng và 0 cho màu đen, giống như một hình ảnh thang độ xám. Và khi chúng ta nhìn vào mặt nạ này, chúng ta có thể thấy rằng nó có một vùng màu trắng là nền màn hình xanh và vùng màu đen là cây thông Noel

Bây giờ, điều đầu tiên chúng ta cần làm là để cây thông Noel hiện ra và chặn nền màn hình xanh

rows,cols,channels = hsv.shape
print[hsv[row, column]]
7

Đầu tiên, để che hình ảnh, chúng tôi sẽ tạo một bản sao hình ảnh khác có tên là ________ 147 của bản sao hình ảnh thay đổi màu sắc của chúng tôi, chỉ trong trường hợp tôi muốn thay đổi mặt nạ sau này

Sau đó, một cách để chọn màn hình xanh là yêu cầu một phần của hình ảnh đó trùng với phần của mặt nạ có màu trắng hoặc không có màu đen. Đó là chúng ta sẽ chọn một phần của hình ảnh mà diện tích của mặt nạ không bằng 0, sử dụng

import cv2
import numpy as np

def show_result[winname, img, wait_time]:
    scale = 0.2
    disp_img = cv2.resize[img, None, fx=scale, fy=scale]
    cv2.imshow[winname, disp_img]
    cv2.waitKey[wait_time]

img = cv2.imread['skull.jpg']
hsv = cv2.cvtColor[img, cv2.COLOR_BGR2HSV]
# define range of green color in HSV
lower_green = np.array[[70, 200, 100]]
upper_green = np.array[[90, 255, 255]]
# Threshold the HSV image to extract green color
mask = cv2.inRange[hsv, lower_green, upper_green]
mask = cv2.bitwise_not[mask]

#cv2.imwrite['mask.png', mask]
show_result['mask', mask, 0]
cv2.destroyAllWindows[]
48. Và để chặn vùng nền này, sau đó chúng tôi đặt các pixel thành màu đen. Bây giờ khi chúng tôi hiển thị kết quả của mình, điều đó sẽ hiển thị khu vực cây thông Noel là khu vực duy nhất hiển thị xuyên suốt

plt. imshow[masked_image]

Nền màn hình xanh đã biến mất, chúng tôi thậm chí có thể thay đổi ngưỡng màu của mình để loại bỏ bất kỳ điểm xanh lam nào, chúng tôi có thể thử bằng cách tăng giá trị xanh lục cao nhất và giảm giá trị xanh lam thấp, điều này sẽ thu được dải màu xanh lam lớn hơn

Mặt nạ và thêm hình nền

Bây giờ, chúng ta chỉ còn một bước cuối cùng là áp dụng nền cho hình ảnh này. Quá trình này khá giống nhau

for i in range[1, 100]:
    img = imread[str[i] + '.jpg']
0

Đầu tiên, chúng ta sẽ đọc một hình ảnh của không gian bên ngoài và chuyển đổi thành Màu RGB. Chúng tôi cũng sẽ cắt nó sao cho nó có cùng kích thước với hình ảnh cái cây của chúng tôi

import cv2
import numpy as np

def show_result[winname, img, wait_time]:
    scale = 0.2
    disp_img = cv2.resize[img, None, fx=scale, fy=scale]
    cv2.imshow[winname, disp_img]
    cv2.waitKey[wait_time]

img = cv2.imread['skull.jpg']
hsv = cv2.cvtColor[img, cv2.COLOR_BGR2HSV]
# define range of green color in HSV
lower_green = np.array[[70, 200, 100]]
upper_green = np.array[[90, 255, 255]]
# Threshold the HSV image to extract green color
mask = cv2.inRange[hsv, lower_green, upper_green]
mask = cv2.bitwise_not[mask]

#cv2.imwrite['mask.png', mask]
show_result['mask', mask, 0]
cv2.destroyAllWindows[]
49 , chúng tôi gọi hình ảnh này là
import cv2
import numpy as np

def show_result[winname, img, wait_time]:
    scale = 0.2
    disp_img = cv2.resize[img, None, fx=scale, fy=scale]
    cv2.imshow[winname, disp_img]
    cv2.waitKey[wait_time]

img = cv2.imread['skull.jpg']
hsv = cv2.cvtColor[img, cv2.COLOR_BGR2HSV]
# define range of green color in HSV
lower_green = np.array[[70, 200, 100]]
upper_green = np.array[[90, 255, 255]]
# Threshold the HSV image to extract green color
mask = cv2.inRange[hsv, lower_green, upper_green]
mask = cv2.bitwise_not[mask]

#cv2.imwrite['mask.png', mask]
show_result['mask', mask, 0]
cv2.destroyAllWindows[]
70 , sau đó chúng tôi áp dụng mặt nạ, lần này sử dụng mặt nạ ngược lại, có nghĩa là chúng tôi muốn nền hiển thị chứ không phải nền . Nếu chúng ta nhìn lại mak trong trường hợp này, chúng ta đang chặn một phần của hình nền nơi mặt nạ bằng 0

Để đảm bảo rằng chúng tôi đã tạo mặt nạ này chính xác, chúng tôi sẽ vẽ hình ảnh kết quả

plt. imshow[crop_background]

Kết quả là hình nền với Cây bị cắt ra

Cuối cùng, chúng ta chỉ cần thêm hai hình ảnh này lại với nhau. Vì vùng màu đen tương đương với số không trong giá trị màu pixel, nên một phép cộng đơn giản sẽ hoạt động

Chủ Đề