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 ảnhimport 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àuKhi 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 npimage = 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]
1print['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 pixelChiều rộng
print['Image type: ', type[image],
'Image Dimensions : ', image.shape]
5 tính bằng pixelprint['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ốnXá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[]
7Vì 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 100Bâ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[]
43rows,cols,channels = hsv.shape
print[hsv[row, column]]
3Hà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 đenTrê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ốtplt. 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