Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Các câu trả lời khác không hiệu quả với tôi. Trước đó, tôi đã dành rất nhiều thời gian để tìm một chức năng mặt nạ tốt. Dưới đây là hai câu trả lời đơn giản chỉ với Numpy.

Show
import numpy as np

arr = np.arange(27).reshape(3,3,3) #3 channel image
mask = np.zeros(shape=(3,3))
mask[1,1] = 1 # binary mask
mask_3d = np.stack((mask,mask,mask),axis=0) #3 channel mask

## Answer 1
# Simply multiply the image array with the mask

masked_arr = arr*mask_3d

## Answer 2
# Use the where function in numpy

masked_arr = np.where(mask_3d==1,arr,mask_3d)

#Both answer gives
print(masked_arr)

array([[[ 0.,  0.,  0.],
        [ 0.,  4.,  0.],
        [ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0., 13.,  0.],
        [ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0., 22.,  0.],
        [ 0.,  0.,  0.]]])

Mặt nạ nhị phân là gì?

Mặt nạ bit chỉ đơn giản là quá trình lưu trữ dữ liệu thực sự dưới dạng bit, trái ngược với việc lưu trữ nó dưới dạng chars/ints/floats. Nó cực kỳ hữu ích để lưu trữ một số loại dữ liệu một cách đơn giản và hiệu quả. Ý tưởng cho mặt nạ bit dựa trên logic boolean.

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Làm thế nào để mặt nạ hoạt động trong Python?

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Phương thức mặt nạ () thay thế các giá trị của các hàng trong đó điều kiện đánh giá là true. Phương thức mặt nạ () đối diện với phương thức ở đâu ().

import cv2
import numpy as np
img = cv2.imread("LPR.png", cv2.IMREAD_GRAYSCALE)
_, threshold = cv2.threshold(img, 50, 255, cv2. THRESH_BINARY_INV)
_, contours, _ = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
    cv2.drawContours(img, [cnt], 0, (0))
cv2.imshow("LPR", img)
cv2.imshow("Threshold", threshold)
cv2.waitKey(0)

Mặt nạ OpenCV là gì?

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Mặt nạ là một kỹ thuật phổ biến để trích xuất khu vực quan tâm (ROI). Trong OpenCV, có thể xây dựng hình dạng mặt nạ tùy ý bằng cách sử dụng chức năng vẽ và hoạt động bitwise. i also try to detect the triangle shape that created by the Vocal cords, also without success.

Có ai có bất kỳ đề xuất nào về cách tôi có thể nhận được kết quả mong muốn hoặc tôi có thể sử dụng phương pháp nào không?

Bất kỳ lời khuyên sẽ giúp, cảm ơn.

Hình ảnh gốc chẳng hạn:

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Vấn đề đã được giải quyết. Đó là tất cả những gì tôi không thể đi xa hơn. Đối với OpenCV 3.x Thêm `_, đường viền, _ =. Mã Python mới đã được thay đổi. Đối với OpenCV 4.x, xem bên dưới:can't go any furthers. For opencv 3.x add this `_, contours, _ = . New python code has been changed. For opencv 4.x, see below:

#!/usr/bin/python37
#Raspberry pi 3B/3B+, 4B, Buster, OpenCV 4.2.0
#Date: 5th April, 2020

import cv2 as cv
import numpy as np

img = cv.imread('organ1.jpg')
image_contours = np.zeros((img.shape[1],
                           img.shape[0], 1),
                          np.uint8)

image_binary = np.zeros((img.shape[1],
                         img.shape[0], 1),
                        np.uint8)

for channel in range(img.shape[2]):
    ret, image_thresh = cv.threshold(img[:, :, channel],
                                     38, 255,
                                     cv.THRESH_BINARY)

    contours = cv.findContours(image_thresh, 1, 1)[0]   
    cv.drawContours(image_contours,
                    contours, -1,
                    (255,255,255), 3)

contours = cv.findContours(image_contours, cv.RETR_LIST,
                           cv.CHAIN_APPROX_SIMPLE)[0]

cv.drawContours(image_binary, [max(contours, key = cv.contourArea)],
                -1, (255, 255, 255), -1)

cv.imwrite('LPR.jpg', image_binary)
cv.imshow('LPR', image_binary)
cv.waitKey(0) & 0xFF is 27
cv.destroyAllWindows()

Output:

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Tổng quan

Giảng dạy: 60 phút Bài tập: 50 phút 60 min
Exercises: 50 min

Câu hỏi

  • Làm thế nào chúng ta có thể sử dụng ngưỡng để tạo ra một hình ảnh nhị phân?

Mục tiêu

  • Giải thích ngưỡng là gì và làm thế nào nó có thể được sử dụng.

  • Sử dụng biểu đồ để xác định các giá trị ngưỡng thích hợp để sử dụng cho quá trình ngưỡng.

  • Áp dụng ngưỡng nhị phân cấp độ đơn giản, cố định cho một hình ảnh.

  • Giải thích sự khác biệt giữa việc sử dụng toán tử

    #!/usr/bin/python37
    #Raspberry pi 3B/3B+, 4B, Buster, OpenCV 4.2.0
    #Date: 5th April, 2020
    
    import cv2 as cv
    import numpy as np
    
    img = cv.imread('organ1.jpg')
    image_contours = np.zeros((img.shape[1],
                               img.shape[0], 1),
                              np.uint8)
    
    image_binary = np.zeros((img.shape[1],
                             img.shape[0], 1),
                            np.uint8)
    
    for channel in range(img.shape[2]):
        ret, image_thresh = cv.threshold(img[:, :, channel],
                                         38, 255,
                                         cv.THRESH_BINARY)
    
        contours = cv.findContours(image_thresh, 1, 1)[0]   
        cv.drawContours(image_contours,
                        contours, -1,
                        (255,255,255), 3)
    
    contours = cv.findContours(image_contours, cv.RETR_LIST,
                               cv.CHAIN_APPROX_SIMPLE)[0]
    
    cv.drawContours(image_binary, [max(contours, key = cv.contourArea)],
                    -1, (255, 255, 255), -1)
    
    cv.imwrite('LPR.jpg', image_binary)
    cv.imshow('LPR', image_binary)
    cv.waitKey(0) & 0xFF is 27
    cv.destroyAllWindows()
    
    5 hoặc toán tử
    #!/usr/bin/python37
    #Raspberry pi 3B/3B+, 4B, Buster, OpenCV 4.2.0
    #Date: 5th April, 2020
    
    import cv2 as cv
    import numpy as np
    
    img = cv.imread('organ1.jpg')
    image_contours = np.zeros((img.shape[1],
                               img.shape[0], 1),
                              np.uint8)
    
    image_binary = np.zeros((img.shape[1],
                             img.shape[0], 1),
                            np.uint8)
    
    for channel in range(img.shape[2]):
        ret, image_thresh = cv.threshold(img[:, :, channel],
                                         38, 255,
                                         cv.THRESH_BINARY)
    
        contours = cv.findContours(image_thresh, 1, 1)[0]   
        cv.drawContours(image_contours,
                        contours, -1,
                        (255,255,255), 3)
    
    contours = cv.findContours(image_contours, cv.RETR_LIST,
                               cv.CHAIN_APPROX_SIMPLE)[0]
    
    cv.drawContours(image_binary, [max(contours, key = cv.contourArea)],
                    -1, (255, 255, 255), -1)
    
    cv.imwrite('LPR.jpg', image_binary)
    cv.imshow('LPR', image_binary)
    cv.waitKey(0) & 0xFF is 27
    cv.destroyAllWindows()
    
    6 để ngưỡng một hình ảnh được biểu thị bằng một mảng numpy.

  • Mô tả hình dạng của một hình ảnh nhị phân được tạo ra bởi ngưỡng thông qua

    #!/usr/bin/python37
    #Raspberry pi 3B/3B+, 4B, Buster, OpenCV 4.2.0
    #Date: 5th April, 2020
    
    import cv2 as cv
    import numpy as np
    
    img = cv.imread('organ1.jpg')
    image_contours = np.zeros((img.shape[1],
                               img.shape[0], 1),
                              np.uint8)
    
    image_binary = np.zeros((img.shape[1],
                             img.shape[0], 1),
                            np.uint8)
    
    for channel in range(img.shape[2]):
        ret, image_thresh = cv.threshold(img[:, :, channel],
                                         38, 255,
                                         cv.THRESH_BINARY)
    
        contours = cv.findContours(image_thresh, 1, 1)[0]   
        cv.drawContours(image_contours,
                        contours, -1,
                        (255,255,255), 3)
    
    contours = cv.findContours(image_contours, cv.RETR_LIST,
                               cv.CHAIN_APPROX_SIMPLE)[0]
    
    cv.drawContours(image_binary, [max(contours, key = cv.contourArea)],
                    -1, (255, 255, 255), -1)
    
    cv.imwrite('LPR.jpg', image_binary)
    cv.imshow('LPR', image_binary)
    cv.waitKey(0) & 0xFF is 27
    cv.destroyAllWindows()
    
    5 hoặc
    #!/usr/bin/python37
    #Raspberry pi 3B/3B+, 4B, Buster, OpenCV 4.2.0
    #Date: 5th April, 2020
    
    import cv2 as cv
    import numpy as np
    
    img = cv.imread('organ1.jpg')
    image_contours = np.zeros((img.shape[1],
                               img.shape[0], 1),
                              np.uint8)
    
    image_binary = np.zeros((img.shape[1],
                             img.shape[0], 1),
                            np.uint8)
    
    for channel in range(img.shape[2]):
        ret, image_thresh = cv.threshold(img[:, :, channel],
                                         38, 255,
                                         cv.THRESH_BINARY)
    
        contours = cv.findContours(image_thresh, 1, 1)[0]   
        cv.drawContours(image_contours,
                        contours, -1,
                        (255,255,255), 3)
    
    contours = cv.findContours(image_contours, cv.RETR_LIST,
                               cv.CHAIN_APPROX_SIMPLE)[0]
    
    cv.drawContours(image_binary, [max(contours, key = cv.contourArea)],
                    -1, (255, 255, 255), -1)
    
    cv.imwrite('LPR.jpg', image_binary)
    cv.imshow('LPR', image_binary)
    cv.waitKey(0) & 0xFF is 27
    cv.destroyAllWindows()
    
    6.

  • Giải thích khi phương pháp OTSU, cho ngưỡng tự động là phù hợp.

  • Áp dụng ngưỡng tự động cho hình ảnh bằng phương pháp OTSU.

  • Sử dụng hàm

    #!/usr/bin/python37
    #Raspberry pi 3B/3B+, 4B, Buster, OpenCV 4.2.0
    #Date: 5th April, 2020
    
    import cv2 as cv
    import numpy as np
    
    img = cv.imread('organ1.jpg')
    image_contours = np.zeros((img.shape[1],
                               img.shape[0], 1),
                              np.uint8)
    
    image_binary = np.zeros((img.shape[1],
                             img.shape[0], 1),
                            np.uint8)
    
    for channel in range(img.shape[2]):
        ret, image_thresh = cv.threshold(img[:, :, channel],
                                         38, 255,
                                         cv.THRESH_BINARY)
    
        contours = cv.findContours(image_thresh, 1, 1)[0]   
        cv.drawContours(image_contours,
                        contours, -1,
                        (255,255,255), 3)
    
    contours = cv.findContours(image_contours, cv.RETR_LIST,
                               cv.CHAIN_APPROX_SIMPLE)[0]
    
    cv.drawContours(image_binary, [max(contours, key = cv.contourArea)],
                    -1, (255, 255, 255), -1)
    
    cv.imwrite('LPR.jpg', image_binary)
    cv.imshow('LPR', image_binary)
    cv.waitKey(0) & 0xFF is 27
    cv.destroyAllWindows()
    
    9 để đếm số pixel khác không trong hình ảnh.

Trong tập này, chúng ta sẽ tìm hiểu cách sử dụng các hàm trượt để áp dụng ngưỡng cho một hình ảnh. Ngưỡng là một loại phân đoạn hình ảnh, trong đó chúng tôi thay đổi các pixel của hình ảnh để làm cho hình ảnh dễ phân tích hơn. Trong ngưỡng, chúng tôi chuyển đổi một hình ảnh từ màu sắc hoặc thang độ xám thành hình ảnh nhị phân, tức là, một hình ảnh đơn giản là màu đen và trắng. Thường xuyên nhất, chúng tôi sử dụng ngưỡng như một cách để chọn các khu vực quan tâm của hình ảnh, trong khi bỏ qua các phần chúng tôi không quan tâm. Chúng tôi đã thực hiện một số ngưỡng đơn giản, trong phần thao tác của các pixel trên các biểu diễn hình ảnh trong tập Skimage. Trong trường hợp đó, chúng tôi đã sử dụng một thao tác mảng numpy đơn giản để tách các pixel thuộc hệ thống rễ của một cây từ nền đen. Trong tập này, chúng ta sẽ học cách sử dụng các hàm trượt để thực hiện ngưỡng. Sau đó, chúng tôi sẽ sử dụng các mặt nạ được trả về bởi các chức năng này để chọn các phần của hình ảnh mà chúng tôi quan tâm.

Ngưỡng đơn giản

Hãy xem xét hình ảnh

import numpy as np
import glob
import matplotlib.pyplot as plt
import skimage.io
import skimage.color
import skimage.filters
%matplotlib widget

# load the image
image = skimage.io.imread("data/shapes-01.jpg")

fig, ax = plt.subplots()
plt.imshow(image)
0 với một loạt các hình dạng cắt thô được đặt trên nền trắng.

import numpy as np
import glob
import matplotlib.pyplot as plt
import skimage.io
import skimage.color
import skimage.filters
%matplotlib widget

# load the image
image = skimage.io.imread("data/shapes-01.jpg")

fig, ax = plt.subplots()
plt.imshow(image)

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Bây giờ giả sử chúng tôi chỉ muốn chọn các hình dạng từ hình ảnh. Nói cách khác, chúng tôi muốn để lại các pixel thuộc về hình dạng trên, trong khi chuyển phần còn lại của pixel, tắt, bằng cách đặt các giá trị kênh màu của chúng thành số không. Thư viện chia sẻ có một số phương pháp ngưỡng khác nhau. Chúng tôi sẽ bắt đầu với phiên bản đơn giản nhất, liên quan đến một bước quan trọng của đầu vào của con người. Cụ thể, trong ngưỡng đơn giản, cố định này, chúng tôi phải cung cấp giá trị ngưỡng

import numpy as np
import glob
import matplotlib.pyplot as plt
import skimage.io
import skimage.color
import skimage.filters
%matplotlib widget

# load the image
image = skimage.io.imread("data/shapes-01.jpg")

fig, ax = plt.subplots()
plt.imshow(image)
1.

Quá trình hoạt động như thế này. Đầu tiên, chúng tôi sẽ tải hình ảnh gốc, chuyển đổi nó thành thang độ xám và phát âm nó như trong tập hình ảnh mờ.

# convert the image to grayscale
gray_image = skimage.color.rgb2gray(image)

# blur the image to denoise
blurred_image = skimage.filters.gaussian(gray_image, sigma=1.0)

fig, ax = plt.subplots()
plt.imshow(blurred_image, cmap="gray")

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Tiếp theo, chúng tôi muốn áp dụng ngưỡng

import numpy as np
import glob
import matplotlib.pyplot as plt
import skimage.io
import skimage.color
import skimage.filters
%matplotlib widget

# load the image
image = skimage.io.imread("data/shapes-01.jpg")

fig, ax = plt.subplots()
plt.imshow(image)
1 sao cho các pixel có giá trị thang độ xám ở một bên của
import numpy as np
import glob
import matplotlib.pyplot as plt
import skimage.io
import skimage.color
import skimage.filters
%matplotlib widget

# load the image
image = skimage.io.imread("data/shapes-01.jpg")

fig, ax = plt.subplots()
plt.imshow(image)
1 sẽ bị biến thành trên trên, trong khi các pixel có giá trị thang độ xám ở phía bên kia sẽ bị tắt. Làm thế nào chúng ta có thể làm điều đó? Hãy nhớ rằng hình ảnh thang độ xám chứa các giá trị pixel trong phạm vi từ 0 đến 1, vì vậy chúng tôi đang tìm kiếm một ngưỡng
import numpy as np
import glob
import matplotlib.pyplot as plt
import skimage.io
import skimage.color
import skimage.filters
%matplotlib widget

# load the image
image = skimage.io.imread("data/shapes-01.jpg")

fig, ax = plt.subplots()
plt.imshow(image)
1 trong phạm vi đóng [0,0, 1.0]. Chúng ta thấy trong hình ảnh rằng các hình dạng hình học là tối hơn so với nền trắng nhưng cũng có một số nhiễu xám nhạt trên nền. Một cách để xác định giá trị tốt của người Viking đối với
import numpy as np
import glob
import matplotlib.pyplot as plt
import skimage.io
import skimage.color
import skimage.filters
%matplotlib widget

# load the image
image = skimage.io.imread("data/shapes-01.jpg")

fig, ax = plt.subplots()
plt.imshow(image)
1 là nhìn vào biểu đồ thang độ xám của hình ảnh và cố gắng xác định phạm vi thang độ xám tương ứng với các hình dạng trong hình ảnh hoặc nền.

Biểu đồ cho hình ảnh hình dạng được hiển thị ở trên có thể được tạo ra như trong tập biểu đồ tạo.

# create a histogram of the blurred grayscale image
histogram, bin_edges = np.histogram(blurred_image, bins=256, range=(0.0, 1.0))

fig, ax = plt.subplots()
plt.plot(bin_edges[0:-1], histogram)
plt.title("Grayscale Histogram")
plt.xlabel("grayscale value")
plt.ylabel("pixels")
plt.xlim(0, 1.0)

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Vì hình ảnh có nền trắng, hầu hết các pixel trong hình là màu trắng. Điều này tương ứng độc đáo với những gì chúng ta thấy trong biểu đồ: có một đỉnh gần giá trị là 1.0. Nếu chúng ta muốn chọn các hình dạng chứ không phải nền, chúng ta muốn tắt các pixel nền trắng, trong khi để các pixel cho các hình dạng được bật. Vì vậy, chúng ta nên chọn một giá trị

import numpy as np
import glob
import matplotlib.pyplot as plt
import skimage.io
import skimage.color
import skimage.filters
%matplotlib widget

# load the image
image = skimage.io.imread("data/shapes-01.jpg")

fig, ax = plt.subplots()
plt.imshow(image)
1 ở đâu đó trước đỉnh lớn và biến các pixel trên giá trị đó. Hãy để chúng tôi chọn
import numpy as np
import glob
import matplotlib.pyplot as plt
import skimage.io
import skimage.color
import skimage.filters
%matplotlib widget

# load the image
image = skimage.io.imread("data/shapes-01.jpg")

fig, ax = plt.subplots()
plt.imshow(image)
7.

Để áp dụng ngưỡng

import numpy as np
import glob
import matplotlib.pyplot as plt
import skimage.io
import skimage.color
import skimage.filters
%matplotlib widget

# load the image
image = skimage.io.imread("data/shapes-01.jpg")

fig, ax = plt.subplots()
plt.imshow(image)
1, chúng ta có thể sử dụng các toán tử so sánh Numpy để tạo mặt nạ. Ở đây, chúng tôi muốn bật trên mạng, tất cả các pixel có giá trị nhỏ hơn ngưỡng, vì vậy chúng tôi sử dụng toán tử ít hơn
#!/usr/bin/python37
#Raspberry pi 3B/3B+, 4B, Buster, OpenCV 4.2.0
#Date: 5th April, 2020

import cv2 as cv
import numpy as np

img = cv.imread('organ1.jpg')
image_contours = np.zeros((img.shape[1],
                           img.shape[0], 1),
                          np.uint8)

image_binary = np.zeros((img.shape[1],
                         img.shape[0], 1),
                        np.uint8)

for channel in range(img.shape[2]):
    ret, image_thresh = cv.threshold(img[:, :, channel],
                                     38, 255,
                                     cv.THRESH_BINARY)

    contours = cv.findContours(image_thresh, 1, 1)[0]   
    cv.drawContours(image_contours,
                    contours, -1,
                    (255,255,255), 3)

contours = cv.findContours(image_contours, cv.RETR_LIST,
                           cv.CHAIN_APPROX_SIMPLE)[0]

cv.drawContours(image_binary, [max(contours, key = cv.contourArea)],
                -1, (255, 255, 255), -1)

cv.imwrite('LPR.jpg', image_binary)
cv.imshow('LPR', image_binary)
cv.waitKey(0) & 0xFF is 27
cv.destroyAllWindows()
6 để so sánh
# convert the image to grayscale
gray_image = skimage.color.rgb2gray(image)

# blur the image to denoise
blurred_image = skimage.filters.gaussian(gray_image, sigma=1.0)

fig, ax = plt.subplots()
plt.imshow(blurred_image, cmap="gray")
0 với ngưỡng
import numpy as np
import glob
import matplotlib.pyplot as plt
import skimage.io
import skimage.color
import skimage.filters
%matplotlib widget

# load the image
image = skimage.io.imread("data/shapes-01.jpg")

fig, ax = plt.subplots()
plt.imshow(image)
1. Người vận hành trả về một mặt nạ, mà chúng tôi chụp trong biến
# convert the image to grayscale
gray_image = skimage.color.rgb2gray(image)

# blur the image to denoise
blurred_image = skimage.filters.gaussian(gray_image, sigma=1.0)

fig, ax = plt.subplots()
plt.imshow(blurred_image, cmap="gray")
2. Chỉ có một kênh và mỗi giá trị của nó là 0 hoặc 1. Mặt nạ nhị phân được tạo bởi hoạt động ngưỡng có thể được hiển thị với
# convert the image to grayscale
gray_image = skimage.color.rgb2gray(image)

# blur the image to denoise
blurred_image = skimage.filters.gaussian(gray_image, sigma=1.0)

fig, ax = plt.subplots()
plt.imshow(blurred_image, cmap="gray")
3, trong đó các mục
# convert the image to grayscale
gray_image = skimage.color.rgb2gray(image)

# blur the image to denoise
blurred_image = skimage.filters.gaussian(gray_image, sigma=1.0)

fig, ax = plt.subplots()
plt.imshow(blurred_image, cmap="gray")
4 được hiển thị dưới dạng pixel màu đen (0 giá trị) và các mục
# convert the image to grayscale
gray_image = skimage.color.rgb2gray(image)

# blur the image to denoise
blurred_image = skimage.filters.gaussian(gray_image, sigma=1.0)

fig, ax = plt.subplots()
plt.imshow(blurred_image, cmap="gray")
5 là được hiển thị dưới dạng pixel trắng (1 giá trị).

# create a mask based on the threshold
t = 0.8
binary_mask = blurred_image < t

fig, ax = plt.subplots()
plt.imshow(binary_mask, cmap="gray")

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Bạn có thể thấy rằng các khu vực có hình dạng trong khu vực ban đầu hiện nay có màu trắng, trong khi phần còn lại của hình ảnh mặt nạ có màu đen.

Điều gì tạo nên một ngưỡng tốt?

Như thường lệ, câu trả lời cho câu hỏi này là, nó phụ thuộc vào. Trong ví dụ trên, chúng ta có thể đã tắt tất cả các pixel nền trắng bằng cách chọn

# convert the image to grayscale
gray_image = skimage.color.rgb2gray(image)

# blur the image to denoise
blurred_image = skimage.filters.gaussian(gray_image, sigma=1.0)

fig, ax = plt.subplots()
plt.imshow(blurred_image, cmap="gray")
6, nhưng điều này sẽ để lại cho chúng ta một số nhiễu nền trong hình ảnh mặt nạ. Mặt khác, nếu chúng ta chọn một giá trị quá thấp cho ngưỡng, chúng ta có thể mất một số hình dạng quá sáng. Bạn có thể thử nghiệm ngưỡng bằng cách chạy lại các dòng mã trên với các giá trị khác nhau cho
import numpy as np
import glob
import matplotlib.pyplot as plt
import skimage.io
import skimage.color
import skimage.filters
%matplotlib widget

# load the image
image = skimage.io.imread("data/shapes-01.jpg")

fig, ax = plt.subplots()
plt.imshow(image)
1. Trong thực tế, đó là vấn đề kiến ​​thức và kinh nghiệm của miền để giải thích các đỉnh trong biểu đồ để xác định một ngưỡng thích hợp. Quá trình này thường liên quan đến thử nghiệm và lỗi, đó là một nhược điểm của phương pháp ngưỡng đơn giản. Dưới đây chúng tôi sẽ giới thiệu ngưỡng tự động, sử dụng định nghĩa toán học, định lượng cho một ngưỡng tốt cho phép chúng tôi tự động xác định giá trị của
import numpy as np
import glob
import matplotlib.pyplot as plt
import skimage.io
import skimage.color
import skimage.filters
%matplotlib widget

# load the image
image = skimage.io.imread("data/shapes-01.jpg")

fig, ax = plt.subplots()
plt.imshow(image)
1. Điều đáng chú ý là nguyên tắc cho ngưỡng đơn giản và tự động cũng có thể được sử dụng cho hình ảnh có phạm vi pixel khác với [0,0, 1.0]. Ví dụ: chúng ta có thể thực hiện ngưỡng trên các giá trị cường độ pixel trong phạm vi [0, 255] như chúng ta đã thấy trong biểu diễn hình ảnh trong tập trượt.

Bây giờ chúng ta có thể áp dụng

# convert the image to grayscale
gray_image = skimage.color.rgb2gray(image)

# blur the image to denoise
blurred_image = skimage.filters.gaussian(gray_image, sigma=1.0)

fig, ax = plt.subplots()
plt.imshow(blurred_image, cmap="gray")
2 cho hình ảnh màu ban đầu như chúng ta đã học được trong tập vẽ và các hoạt động bitwise. Những gì chúng ta còn lại chỉ là những hình dạng màu từ bản gốc.

# use the binary_mask to select the "interesting" part of the image
selection = image.copy()
selection[~binary_mask] = 0

fig, ax = plt.subplots()
plt.imshow(selection)

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Thực hành nhiều hơn với ngưỡng đơn giản (15 phút)

Bây giờ, đến lượt bạn thực hành. Giả sử chúng ta muốn sử dụng ngưỡng đơn giản để chỉ chọn các hình dạng màu (trong trường hợp cụ thể này, chúng ta cũng coi màu xám là một màu) từ hình ảnh

# create a histogram of the blurred grayscale image
histogram, bin_edges = np.histogram(blurred_image, bins=256, range=(0.0, 1.0))

fig, ax = plt.subplots()
plt.plot(bin_edges[0:-1], histogram)
plt.title("Grayscale Histogram")
plt.xlabel("grayscale value")
plt.ylabel("pixels")
plt.xlim(0, 1.0)
0:

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Đầu tiên, vẽ biểu đồ biểu đồ thang độ xám như trong tập biểu đồ tạo và kiểm tra phân phối các giá trị thang độ xám trong hình ảnh. Bạn nghĩ gì sẽ là một giá trị tốt cho ngưỡng

import numpy as np
import glob
import matplotlib.pyplot as plt
import skimage.io
import skimage.color
import skimage.filters
%matplotlib widget

# load the image
image = skimage.io.imread("data/shapes-01.jpg")

fig, ax = plt.subplots()
plt.imshow(image)
1?

Dung dịch

Biểu đồ cho hình ảnh

# create a histogram of the blurred grayscale image
histogram, bin_edges = np.histogram(blurred_image, bins=256, range=(0.0, 1.0))

fig, ax = plt.subplots()
plt.plot(bin_edges[0:-1], histogram)
plt.title("Grayscale Histogram")
plt.xlabel("grayscale value")
plt.ylabel("pixels")
plt.xlim(0, 1.0)
0 có thể được hiển thị với

gray_image = skimage.io.imread("data/shapes-02.jpg", as_gray=True)
histogram, bin_edges = np.histogram(gray_image, bins=256, range=(0.0, 1.0))

fig, ax = plt.subplots()
plt.plot(bin_edges[0:-1], histogram)
plt.title("Graylevel histogram")
plt.xlabel("gray value")
plt.ylabel("pixel count")
plt.xlim(0, 1.0)

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Chúng ta có thể thấy một mũi nhọn lớn khoảng 0,3 và tăng đột biến nhỏ hơn khoảng 0,7. Sự tăng đột biến gần 0,3 đại diện cho nền tối hơn, vì vậy nó có vẻ như là một giá trị gần với

# create a histogram of the blurred grayscale image
histogram, bin_edges = np.histogram(blurred_image, bins=256, range=(0.0, 1.0))

fig, ax = plt.subplots()
plt.plot(bin_edges[0:-1], histogram)
plt.title("Grayscale Histogram")
plt.xlabel("grayscale value")
plt.ylabel("pixels")
plt.xlim(0, 1.0)
3 sẽ là một lựa chọn tốt.

Tiếp theo, tạo một mặt nạ để bật các pixel phía trên ngưỡng

import numpy as np
import glob
import matplotlib.pyplot as plt
import skimage.io
import skimage.color
import skimage.filters
%matplotlib widget

# load the image
image = skimage.io.imread("data/shapes-01.jpg")

fig, ax = plt.subplots()
plt.imshow(image)
1 BẬT và các pixel bên dưới ngưỡng
import numpy as np
import glob
import matplotlib.pyplot as plt
import skimage.io
import skimage.color
import skimage.filters
%matplotlib widget

# load the image
image = skimage.io.imread("data/shapes-01.jpg")

fig, ax = plt.subplots()
plt.imshow(image)
1 tắt. Lưu ý rằng không giống như hình ảnh có nền trắng mà chúng tôi đã sử dụng ở trên, ở đây đỉnh cho màu nền ở mức màu xám thấp hơn các hình dạng. Do đó, thay đổi toán tử so sánh ít
#!/usr/bin/python37
#Raspberry pi 3B/3B+, 4B, Buster, OpenCV 4.2.0
#Date: 5th April, 2020

import cv2 as cv
import numpy as np

img = cv.imread('organ1.jpg')
image_contours = np.zeros((img.shape[1],
                           img.shape[0], 1),
                          np.uint8)

image_binary = np.zeros((img.shape[1],
                         img.shape[0], 1),
                        np.uint8)

for channel in range(img.shape[2]):
    ret, image_thresh = cv.threshold(img[:, :, channel],
                                     38, 255,
                                     cv.THRESH_BINARY)

    contours = cv.findContours(image_thresh, 1, 1)[0]   
    cv.drawContours(image_contours,
                    contours, -1,
                    (255,255,255), 3)

contours = cv.findContours(image_contours, cv.RETR_LIST,
                           cv.CHAIN_APPROX_SIMPLE)[0]

cv.drawContours(image_binary, [max(contours, key = cv.contourArea)],
                -1, (255, 255, 255), -1)

cv.imwrite('LPR.jpg', image_binary)
cv.imshow('LPR', image_binary)
cv.waitKey(0) & 0xFF is 27
cv.destroyAllWindows()
6 thành lớn hơn
#!/usr/bin/python37
#Raspberry pi 3B/3B+, 4B, Buster, OpenCV 4.2.0
#Date: 5th April, 2020

import cv2 as cv
import numpy as np

img = cv.imread('organ1.jpg')
image_contours = np.zeros((img.shape[1],
                           img.shape[0], 1),
                          np.uint8)

image_binary = np.zeros((img.shape[1],
                         img.shape[0], 1),
                        np.uint8)

for channel in range(img.shape[2]):
    ret, image_thresh = cv.threshold(img[:, :, channel],
                                     38, 255,
                                     cv.THRESH_BINARY)

    contours = cv.findContours(image_thresh, 1, 1)[0]   
    cv.drawContours(image_contours,
                    contours, -1,
                    (255,255,255), 3)

contours = cv.findContours(image_contours, cv.RETR_LIST,
                           cv.CHAIN_APPROX_SIMPLE)[0]

cv.drawContours(image_binary, [max(contours, key = cv.contourArea)],
                -1, (255, 255, 255), -1)

cv.imwrite('LPR.jpg', image_binary)
cv.imshow('LPR', image_binary)
cv.waitKey(0) & 0xFF is 27
cv.destroyAllWindows()
5 để tạo mặt nạ thích hợp. Sau đó áp dụng mặt nạ vào hình ảnh và xem hình ảnh ngưỡng. Nếu mọi thứ hoạt động như bình thường, đầu ra của bạn chỉ hiển thị các hình dạng màu trên nền đen.

Dung dịch

Biểu đồ cho hình ảnh

# create a histogram of the blurred grayscale image
histogram, bin_edges = np.histogram(blurred_image, bins=256, range=(0.0, 1.0))

fig, ax = plt.subplots()
plt.plot(bin_edges[0:-1], histogram)
plt.title("Grayscale Histogram")
plt.xlabel("grayscale value")
plt.ylabel("pixels")
plt.xlim(0, 1.0)
0 có thể được hiển thị với

t = 0.5
binary_mask = gray_image > t

fig, ax = plt.subplots()
plt.imshow(binary_mask, cmap="gray")

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Chúng ta có thể thấy một mũi nhọn lớn khoảng 0,3 và tăng đột biến nhỏ hơn khoảng 0,7. Sự tăng đột biến gần 0,3 đại diện cho nền tối hơn, vì vậy nó có vẻ như là một giá trị gần với

# create a histogram of the blurred grayscale image
histogram, bin_edges = np.histogram(blurred_image, bins=256, range=(0.0, 1.0))

fig, ax = plt.subplots()
plt.plot(bin_edges[0:-1], histogram)
plt.title("Grayscale Histogram")
plt.xlabel("grayscale value")
plt.ylabel("pixels")
plt.xlim(0, 1.0)
3 sẽ là một lựa chọn tốt.

import cv2
import numpy as np
img = cv2.imread("LPR.png", cv2.IMREAD_GRAYSCALE)
_, threshold = cv2.threshold(img, 50, 255, cv2. THRESH_BINARY_INV)
_, contours, _ = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
    cv2.drawContours(img, [cnt], 0, (0))
cv2.imshow("LPR", img)
cv2.imshow("Threshold", threshold)
cv2.waitKey(0)
0

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Tiếp theo, tạo một mặt nạ để bật các pixel phía trên ngưỡng import numpy as np import glob import matplotlib.pyplot as plt import skimage.io import skimage.color import skimage.filters %matplotlib widget # load the image image = skimage.io.imread("data/shapes-01.jpg") fig, ax = plt.subplots() plt.imshow(image) 1 BẬT và các pixel bên dưới ngưỡng import numpy as np import glob import matplotlib.pyplot as plt import skimage.io import skimage.color import skimage.filters %matplotlib widget # load the image image = skimage.io.imread("data/shapes-01.jpg") fig, ax = plt.subplots() plt.imshow(image) 1 tắt. Lưu ý rằng không giống như hình ảnh có nền trắng mà chúng tôi đã sử dụng ở trên, ở đây đỉnh cho màu nền ở mức màu xám thấp hơn các hình dạng. Do đó, thay đổi toán tử so sánh ít #!/usr/bin/python37 #Raspberry pi 3B/3B+, 4B, Buster, OpenCV 4.2.0 #Date: 5th April, 2020 import cv2 as cv import numpy as np img = cv.imread('organ1.jpg') image_contours = np.zeros((img.shape[1], img.shape[0], 1), np.uint8) image_binary = np.zeros((img.shape[1], img.shape[0], 1), np.uint8) for channel in range(img.shape[2]): ret, image_thresh = cv.threshold(img[:, :, channel], 38, 255, cv.THRESH_BINARY) contours = cv.findContours(image_thresh, 1, 1)[0] cv.drawContours(image_contours, contours, -1, (255,255,255), 3) contours = cv.findContours(image_contours, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)[0] cv.drawContours(image_binary, [max(contours, key = cv.contourArea)], -1, (255, 255, 255), -1) cv.imwrite('LPR.jpg', image_binary) cv.imshow('LPR', image_binary) cv.waitKey(0) & 0xFF is 27 cv.destroyAllWindows() 6 thành lớn hơn #!/usr/bin/python37 #Raspberry pi 3B/3B+, 4B, Buster, OpenCV 4.2.0 #Date: 5th April, 2020 import cv2 as cv import numpy as np img = cv.imread('organ1.jpg') image_contours = np.zeros((img.shape[1], img.shape[0], 1), np.uint8) image_binary = np.zeros((img.shape[1], img.shape[0], 1), np.uint8) for channel in range(img.shape[2]): ret, image_thresh = cv.threshold(img[:, :, channel], 38, 255, cv.THRESH_BINARY) contours = cv.findContours(image_thresh, 1, 1)[0] cv.drawContours(image_contours, contours, -1, (255,255,255), 3) contours = cv.findContours(image_contours, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)[0] cv.drawContours(image_binary, [max(contours, key = cv.contourArea)], -1, (255, 255, 255), -1) cv.imwrite('LPR.jpg', image_binary) cv.imshow('LPR', image_binary) cv.waitKey(0) & 0xFF is 27 cv.destroyAllWindows() 5 để tạo mặt nạ thích hợp. Sau đó áp dụng mặt nạ vào hình ảnh và xem hình ảnh ngưỡng. Nếu mọi thứ hoạt động như bình thường, đầu ra của bạn chỉ hiển thị các hình dạng màu trên nền đen.

Dưới đây là các lệnh để tạo và xem mặt nạ nhị phân

Và đây là các lệnh để áp dụng mặt nạ và xem hình ảnh ngưỡng

Ngưỡng tự động

Nhược điểm của kỹ thuật ngưỡng đơn giản là chúng ta phải đưa ra một dự đoán có giáo dục về ngưỡng

import numpy as np
import glob
import matplotlib.pyplot as plt
import skimage.io
import skimage.color
import skimage.filters
%matplotlib widget

# load the image
image = skimage.io.imread("data/shapes-01.jpg")

fig, ax = plt.subplots()
plt.imshow(image)
1 bằng cách kiểm tra biểu đồ. Ngoài ra còn có các phương pháp ngưỡng tự động có thể tự động xác định ngưỡng cho chúng tôi. Một phương pháp như vậy là phương pháp OTSU. Nó đặc biệt hữu ích cho các tình huống mà biểu đồ thang độ xám của một hình ảnh có hai đỉnh tương ứng với nền và các đối tượng quan tâm.

import cv2
import numpy as np
img = cv2.imread("LPR.png", cv2.IMREAD_GRAYSCALE)
_, threshold = cv2.threshold(img, 50, 255, cv2. THRESH_BINARY_INV)
_, contours, _ = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
    cv2.drawContours(img, [cnt], 0, (0))
cv2.imshow("LPR", img)
cv2.imshow("Threshold", threshold)
cv2.waitKey(0)
1

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Làm mất đi một hình ảnh trước khi ngưỡng

import cv2
import numpy as np
img = cv2.imread("LPR.png", cv2.IMREAD_GRAYSCALE)
_, threshold = cv2.threshold(img, 50, 255, cv2. THRESH_BINARY_INV)
_, contours, _ = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
    cv2.drawContours(img, [cnt], 0, (0))
cv2.imshow("LPR", img)
cv2.imshow("Threshold", threshold)
cv2.waitKey(0)
2

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Trong thực tế, thường cần phải từ chối hình ảnh trước khi ngưỡng, có thể được thực hiện với một trong những phương pháp từ tập hình ảnh mờ.

Hãy xem xét hình ảnh

# create a histogram of the blurred grayscale image
histogram, bin_edges = np.histogram(blurred_image, bins=256, range=(0.0, 1.0))

fig, ax = plt.subplots()
plt.plot(bin_edges[0:-1], histogram)
plt.title("Grayscale Histogram")
plt.xlabel("grayscale value")
plt.ylabel("pixels")
plt.xlim(0, 1.0)
9 của hệ thống gốc ngô mà chúng ta đã thấy trước đây trong biểu diễn hình ảnh trong tập trượt.

import cv2
import numpy as np
img = cv2.imread("LPR.png", cv2.IMREAD_GRAYSCALE)
_, threshold = cv2.threshold(img, 50, 255, cv2. THRESH_BINARY_INV)
_, contours, _ = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
    cv2.drawContours(img, [cnt], 0, (0))
cv2.imshow("LPR", img)
cv2.imshow("Threshold", threshold)
cv2.waitKey(0)
3

import cv2
import numpy as np
img = cv2.imread("LPR.png", cv2.IMREAD_GRAYSCALE)
_, threshold = cv2.threshold(img, 50, 255, cv2. THRESH_BINARY_INV)
_, contours, _ = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
    cv2.drawContours(img, [cnt], 0, (0))
cv2.imshow("LPR", img)
cv2.imshow("Threshold", threshold)
cv2.waitKey(0)
4

Chúng tôi sử dụng Gaussian Blur với Sigma là 1.0 để từ chối hình ảnh gốc. Chúng ta hãy nhìn vào biểu đồ thang độ xám của hình ảnh bị biến dạng.

import cv2
import numpy as np
img = cv2.imread("LPR.png", cv2.IMREAD_GRAYSCALE)
_, threshold = cv2.threshold(img, 50, 255, cv2. THRESH_BINARY_INV)
_, contours, _ = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
    cv2.drawContours(img, [cnt], 0, (0))
cv2.imshow("LPR", img)
cv2.imshow("Threshold", threshold)
cv2.waitKey(0)
5

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Biểu đồ có một đỉnh đáng kể khoảng 0,2 và một đỉnh thứ hai, nhỏ hơn rất gần 1,0. Do đó, hình ảnh này là một ứng cử viên tốt cho ngưỡng với phương pháp OTSU. Các chi tiết toán học về cách thức hoạt động này rất phức tạp (xem tài liệu trượt nếu bạn quan tâm), nhưng kết quả là phương pháp OTSU, tìm thấy giá trị ngưỡng giữa hai đỉnh của biểu đồ thang độ xám.

import cv2
import numpy as np
img = cv2.imread("LPR.png", cv2.IMREAD_GRAYSCALE)
_, threshold = cv2.threshold(img, 50, 255, cv2. THRESH_BINARY_INV)
_, contours, _ = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
    cv2.drawContours(img, [cnt], 0, (0))
cv2.imshow("LPR", img)
cv2.imshow("Threshold", threshold)
cv2.waitKey(0)
6

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Hàm # create a mask based on the threshold t = 0.8 binary_mask = blurred_image < t fig, ax = plt.subplots() plt.imshow(binary_mask, cmap="gray") 0 có thể được sử dụng để tự động xác định ngưỡng thông qua phương thức OTSU. Sau đó, các toán tử so sánh Numpy có thể được sử dụng để áp dụng nó như trước đây. Dưới đây là các lệnh Python để xác định ngưỡng import numpy as np import glob import matplotlib.pyplot as plt import skimage.io import skimage.color import skimage.filters %matplotlib widget # load the image image = skimage.io.imread("data/shapes-01.jpg") fig, ax = plt.subplots() plt.imshow(image) 1 bằng phương pháp OTSU.

Đối với hình ảnh gốc này và độ mờ Gaussian với sigma đã chọn là 1.0, giá trị ngưỡng được tính toán là 0,42. Không, chúng ta có thể tạo mặt nạ nhị phân với toán tử so sánh

#!/usr/bin/python37
#Raspberry pi 3B/3B+, 4B, Buster, OpenCV 4.2.0
#Date: 5th April, 2020

import cv2 as cv
import numpy as np

img = cv.imread('organ1.jpg')
image_contours = np.zeros((img.shape[1],
                           img.shape[0], 1),
                          np.uint8)

image_binary = np.zeros((img.shape[1],
                         img.shape[0], 1),
                        np.uint8)

for channel in range(img.shape[2]):
    ret, image_thresh = cv.threshold(img[:, :, channel],
                                     38, 255,
                                     cv.THRESH_BINARY)

    contours = cv.findContours(image_thresh, 1, 1)[0]   
    cv.drawContours(image_contours,
                    contours, -1,
                    (255,255,255), 3)

contours = cv.findContours(image_contours, cv.RETR_LIST,
                           cv.CHAIN_APPROX_SIMPLE)[0]

cv.drawContours(image_binary, [max(contours, key = cv.contourArea)],
                -1, (255, 255, 255), -1)

cv.imwrite('LPR.jpg', image_binary)
cv.imshow('LPR', image_binary)
cv.waitKey(0) & 0xFF is 27
cv.destroyAllWindows()
5. Như chúng ta đã thấy trước đây, pixel trên giá trị ngưỡng sẽ được bật, những pixel dưới ngưỡng sẽ bị tắt.

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Cuối cùng, chúng tôi sử dụng mặt nạ để chọn tiền cảnh:

Ứng dụng: Đo khối lượng gốc

  1. Bây giờ chúng ta hãy chuyển sang một ứng dụng nơi chúng ta có thể áp dụng ngưỡng và các kỹ thuật khác mà chúng ta đã học được cho điểm này. Hãy xem xét bốn hình ảnh hệ thống gốc ngô này mà bạn có thể tìm thấy trong các tệp
    # create a mask based on the threshold
    t = 0.8
    binary_mask = blurred_image < t
    
    fig, ax = plt.subplots()
    plt.imshow(binary_mask, cmap="gray")
    
    3,
    # create a mask based on the threshold
    t = 0.8
    binary_mask = blurred_image < t
    
    fig, ax = plt.subplots()
    plt.imshow(binary_mask, cmap="gray")
    
    4,
    # create a mask based on the threshold
    t = 0.8
    binary_mask = blurred_image < t
    
    fig, ax = plt.subplots()
    plt.imshow(binary_mask, cmap="gray")
    
    5 và
    # create a mask based on the threshold
    t = 0.8
    binary_mask = blurred_image < t
    
    fig, ax = plt.subplots()
    plt.imshow(binary_mask, cmap="gray")
    
    6.
  2. Giả sử chúng ta quan tâm đến lượng vật liệu thực vật trong mỗi hình ảnh và đặc biệt là số lượng đó thay đổi từ hình ảnh này sang hình ảnh khác. Có lẽ các hình ảnh đại diện cho sự phát triển của nhà máy theo thời gian, hoặc có lẽ các hình ảnh cho thấy bốn giống ngô khác nhau ở cùng một giai đoạn tăng trưởng của chúng. Câu hỏi mà chúng tôi muốn trả lời là, có bao nhiêu khối lượng gốc trong mỗi hình ảnh?
  3. Trước tiên chúng tôi sẽ xây dựng một chương trình Python để đo giá trị này cho một hình ảnh duy nhất. Chiến lược của chúng tôi sẽ là thế này:
  4. Đọc hình ảnh, chuyển đổi nó thành thang độ xám như nó được đọc. Đối với ứng dụng này, chúng tôi không cần hình ảnh màu.
  5. Làm mờ hình ảnh.
  6. Sử dụng phương pháp ngưỡng OTSU, để tạo ra một hình ảnh nhị phân, trong đó các pixel là một phần của cây ngô có màu trắng và mọi thứ khác đều màu đen.

Lưu hình ảnh nhị phân để nó có thể được kiểm tra sau.

Dưới đây là một chức năng Python thực hiện chiến lược đo khối gốc này. Vì hàm được dự định để tạo ra đầu ra số mà không có sự tương tác của con người, nó không hiển thị bất kỳ hình ảnh nào. Hầu như tất cả các lệnh nên quen thuộc, và trên thực tế, nó có vẻ đơn giản hơn mã chúng tôi đã làm cho đến nay, bởi vì chúng tôi không hiển thị bất kỳ hình ảnh nào.

import cv2
import numpy as np
img = cv2.imread("LPR.png", cv2.IMREAD_GRAYSCALE)
_, threshold = cv2.threshold(img, 50, 255, cv2. THRESH_BINARY_INV)
_, contours, _ = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
    cv2.drawContours(img, [cnt], 0, (0))
cv2.imshow("LPR", img)
cv2.imshow("Threshold", threshold)
cv2.waitKey(0)
7

Hàm bắt đầu bằng việc đọc hình ảnh orign từ tệp

# create a mask based on the threshold
t = 0.8
binary_mask = blurred_image < t

fig, ax = plt.subplots()
plt.imshow(binary_mask, cmap="gray")
7. Chúng tôi sử dụng
# create a mask based on the threshold
t = 0.8
binary_mask = blurred_image < t

fig, ax = plt.subplots()
plt.imshow(binary_mask, cmap="gray")
8 với đối số tùy chọn
# create a mask based on the threshold
t = 0.8
binary_mask = blurred_image < t

fig, ax = plt.subplots()
plt.imshow(binary_mask, cmap="gray")
9 để tự động chuyển đổi nó thành thang độ xám. Tiếp theo, hình ảnh thang độ xám được làm mờ với bộ lọc Gaussian với giá trị
# use the binary_mask to select the "interesting" part of the image
selection = image.copy()
selection[~binary_mask] = 0

fig, ax = plt.subplots()
plt.imshow(selection)
0 được truyền cho hàm. Sau đó, chúng tôi xác định ngưỡng
import numpy as np
import glob
import matplotlib.pyplot as plt
import skimage.io
import skimage.color
import skimage.filters
%matplotlib widget

# load the image
image = skimage.io.imread("data/shapes-01.jpg")

fig, ax = plt.subplots()
plt.imshow(image)
1 bằng phương pháp OTSU và tạo mặt nạ nhị phân giống như chúng tôi đã làm trong phần trước. Cho đến thời điểm này, mọi thứ nên quen thuộc.

Phần cuối cùng của hàm xác định tỷ lệ khối lượng gốc trong hình ảnh. Hãy nhớ lại rằng trong

# convert the image to grayscale
gray_image = skimage.color.rgb2gray(image)

# blur the image to denoise
blurred_image = skimage.filters.gaussian(gray_image, sigma=1.0)

fig, ax = plt.subplots()
plt.imshow(blurred_image, cmap="gray")
2, mọi pixel đều có giá trị bằng không (màu đen/nền) hoặc một (trắng/tiền cảnh). Chúng tôi muốn đếm số lượng pixel trắng, có thể được thực hiện bằng một cuộc gọi đến hàm numpy
# use the binary_mask to select the "interesting" part of the image
selection = image.copy()
selection[~binary_mask] = 0

fig, ax = plt.subplots()
plt.imshow(selection)
3. Sau đó, chúng tôi xác định chiều rộng và chiều cao của hình ảnh bằng cách sử dụng các phần tử của
# use the binary_mask to select the "interesting" part of the image
selection = image.copy()
selection[~binary_mask] = 0

fig, ax = plt.subplots()
plt.imshow(selection)
4 (nghĩa là kích thước của mảng numpy lưu trữ hình ảnh). Cuối cùng, tỷ lệ mật độ được tính bằng cách chia số lượng pixel trắng cho tổng số pixel
# use the binary_mask to select the "interesting" part of the image
selection = image.copy()
selection[~binary_mask] = 0

fig, ax = plt.subplots()
plt.imshow(selection)
5 trong hình ảnh. Hàm trả về sau đó mật độ gốc của hình ảnh.

Chúng ta có thể gọi chức năng này với bất kỳ tên tệp nào và cung cấp giá trị sigma cho việc làm mờ. Nếu không có giá trị Sigma được cung cấp, giá trị mặc định 1.0 sẽ được sử dụng. Ví dụ: đối với tệp

# create a mask based on the threshold
t = 0.8
binary_mask = blurred_image < t

fig, ax = plt.subplots()
plt.imshow(binary_mask, cmap="gray")
3 và giá trị sigma là 1.5, chúng tôi sẽ gọi hàm như thế này:

import cv2
import numpy as np
img = cv2.imread("LPR.png", cv2.IMREAD_GRAYSCALE)
_, threshold = cv2.threshold(img, 50, 255, cv2. THRESH_BINARY_INV)
_, contours, _ = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
    cv2.drawContours(img, [cnt], 0, (0))
cv2.imshow("LPR", img)
cv2.imshow("Threshold", threshold)
cv2.waitKey(0)
8

Bây giờ chúng ta có thể sử dụng chức năng để xử lý loạt bốn hình ảnh được hiển thị ở trên. Trong một tình huống khoa học trong thế giới thực, có thể có hàng tá, hàng trăm hoặc thậm chí hàng ngàn hình ảnh để xử lý. Để lưu chúng tôi tiveium về việc gọi hàm cho mỗi hình ảnh bằng tay, chúng tôi có thể viết một vòng lặp tự động xử lý tất cả các tệp. Khối mã sau đây giả định rằng các tệp được đặt trong cùng một thư mục và tên tệp đều bắt đầu với tiền tố dùng thử và kết thúc với hậu tố .jpg.trial- prefix and end with the .jpg suffix.

import cv2
import numpy as np
img = cv2.imread("LPR.png", cv2.IMREAD_GRAYSCALE)
_, threshold = cv2.threshold(img, 50, 255, cv2. THRESH_BINARY_INV)
_, contours, _ = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
    cv2.drawContours(img, [cnt], 0, (0))
cv2.imshow("LPR", img)
cv2.imshow("Threshold", threshold)
cv2.waitKey(0)
9

#!/usr/bin/python37
#Raspberry pi 3B/3B+, 4B, Buster, OpenCV 4.2.0
#Date: 5th April, 2020

import cv2 as cv
import numpy as np

img = cv.imread('organ1.jpg')
image_contours = np.zeros((img.shape[1],
                           img.shape[0], 1),
                          np.uint8)

image_binary = np.zeros((img.shape[1],
                         img.shape[0], 1),
                        np.uint8)

for channel in range(img.shape[2]):
    ret, image_thresh = cv.threshold(img[:, :, channel],
                                     38, 255,
                                     cv.THRESH_BINARY)

    contours = cv.findContours(image_thresh, 1, 1)[0]   
    cv.drawContours(image_contours,
                    contours, -1,
                    (255,255,255), 3)

contours = cv.findContours(image_contours, cv.RETR_LIST,
                           cv.CHAIN_APPROX_SIMPLE)[0]

cv.drawContours(image_binary, [max(contours, key = cv.contourArea)],
                -1, (255, 255, 255), -1)

cv.imwrite('LPR.jpg', image_binary)
cv.imshow('LPR', image_binary)
cv.waitKey(0) & 0xFF is 27
cv.destroyAllWindows()
0

Bỏ qua nhiều hình ảnh hơn - động não (10 phút)

Chúng ta hãy xem xét kỹ hơn các mặt nạ nhị phân được sản xuất bởi hàm

# use the binary_mask to select the "interesting" part of the image
selection = image.copy()
selection[~binary_mask] = 0

fig, ax = plt.subplots()
plt.imshow(selection)
7.

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Bạn có thể đã nhận thấy trong phần về ngưỡng tự động mà hình ảnh được ngưỡng không bao gồm các vùng của hình ảnh sang một bên của rễ cây: các nhãn được đánh số và các vòng tròn màu trắng trong mỗi hình ảnh được bảo tồn trong ngưỡng, bởi vì các giá trị thang màu của chúng ở trên ngưỡng . Do đó, các tỷ lệ khối gốc được tính toán của chúng tôi bao gồm các pixel trắng của nhãn và vòng tròn trắng không phải là một phần của rễ cây. Những pixel bổ sung đó ảnh hưởng đến mức độ chính xác của tính toán khối lượng gốc!

Làm thế nào chúng ta có thể loại bỏ các nhãn và vòng tròn trước khi tính tỷ lệ, để kết quả của chúng ta chính xác hơn? Hãy suy nghĩ về một số lựa chọn đưa ra những gì chúng ta đã học được cho đến nay.

Dung dịch

Một cách tiếp cận chúng ta có thể thực hiện là cố gắng che giấu hoàn toàn một vùng từ mỗi hình ảnh, đặc biệt, khu vực chứa vòng tròn màu trắng và nhãn được đánh số. Nếu chúng tôi có tọa độ cho một khu vực hình chữ nhật trên hình ảnh có chứa vòng tròn và nhãn, chúng tôi có thể che giấu khu vực dễ dàng bằng cách sử dụng các kỹ thuật chúng tôi đã học trong tập vẽ và hoạt động bitwise.

Tuy nhiên, việc kiểm tra kỹ hơn các hình ảnh nhị phân làm tăng một số vấn đề với phương pháp đó. Vì rễ không phải lúc nào cũng bị giới hạn ở một khu vực nhất định trong hình ảnh và vì các vòng tròn và nhãn ở các vị trí khác nhau mỗi lần, chúng tôi sẽ gặp khó khăn trong việc gặp phải một hình chữ nhật duy nhất có tác dụng cho mọi hình ảnh. Chúng ta có thể tạo một hình chữ nhật mặt nạ khác nhau cho mỗi hình ảnh, nhưng đó không phải là cách tiếp cận thực tế nếu chúng ta có hàng trăm hoặc hàng ngàn hình ảnh để xử lý.

Một cách tiếp cận khác mà chúng tôi có thể thực hiện là áp dụng hai bước ngưỡng cho hình ảnh. Nhìn vào biểu đồ Graylevel của tệp

# create a mask based on the threshold
t = 0.8
binary_mask = blurred_image < t

fig, ax = plt.subplots()
plt.imshow(binary_mask, cmap="gray")
3 được hiển thị ở trên một lần nữa: Lưu ý đỉnh gần 1.0? Hãy nhớ lại rằng giá trị thang độ xám là 1.0 tương ứng với các pixel trắng: đỉnh tương ứng với nhãn trắng và vòng tròn. Vì vậy, chúng ta có thể sử dụng ngưỡng nhị phân đơn giản để che giấu vòng tròn màu trắng và nhãn từ hình ảnh, và sau đó chúng ta có thể sử dụng phương pháp OTSU, để chọn các pixel trong phần thực vật của hình ảnh.

Lưu ý rằng hầu hết các công việc bổ sung này trong việc xử lý hình ảnh có thể được tránh trong giai đoạn thiết kế thử nghiệm, với một số xem xét cẩn thận về cách sử dụng hình ảnh kết quả. Ví dụ, tất cả các biện pháp sau đây có thể làm cho hình ảnh dễ xử lý hơn, bằng cách giúp chúng tôi dự đoán và/hoặc phát hiện vị trí của nhãn trong hình ảnh và sau đó che giấu nó khỏi xử lý tiếp theo:

  • Sử dụng nhãn có kích thước và hình dạng nhất quán
  • Đặt tất cả các nhãn ở cùng một vị trí, so với mẫu
  • Sử dụng nhãn không phải là người da trắng, với văn bản không phải là người da đen

Bỏ qua nhiều hình ảnh hơn - triển khai (30 phút - tùy chọn, không bao gồm trong thời gian)

Thực hiện phiên bản nâng cao của hàm

# use the binary_mask to select the "interesting" part of the image
selection = image.copy()
selection[~binary_mask] = 0

fig, ax = plt.subplots()
plt.imshow(selection)
7 áp dụng ngưỡng nhị phân đơn giản để loại bỏ vòng tròn trắng và nhãn khỏi hình ảnh trước khi áp dụng phương thức OTSU.

Dung dịch

Chúng ta có thể áp dụng một ngưỡng nhị phân đơn giản với ngưỡng

gray_image = skimage.io.imread("data/shapes-02.jpg", as_gray=True)
histogram, bin_edges = np.histogram(gray_image, bins=256, range=(0.0, 1.0))

fig, ax = plt.subplots()
plt.plot(bin_edges[0:-1], histogram)
plt.title("Graylevel histogram")
plt.xlabel("gray value")
plt.ylabel("pixel count")
plt.xlim(0, 1.0)
0 để xóa nhãn và vòng tròn khỏi hình ảnh. Chúng tôi sử dụng mặt nạ nhị phân để đặt các pixel trong hình ảnh mờ thành 0 (màu đen).

#!/usr/bin/python37
#Raspberry pi 3B/3B+, 4B, Buster, OpenCV 4.2.0
#Date: 5th April, 2020

import cv2 as cv
import numpy as np

img = cv.imread('organ1.jpg')
image_contours = np.zeros((img.shape[1],
                           img.shape[0], 1),
                          np.uint8)

image_binary = np.zeros((img.shape[1],
                         img.shape[0], 1),
                        np.uint8)

for channel in range(img.shape[2]):
    ret, image_thresh = cv.threshold(img[:, :, channel],
                                     38, 255,
                                     cv.THRESH_BINARY)

    contours = cv.findContours(image_thresh, 1, 1)[0]   
    cv.drawContours(image_contours,
                    contours, -1,
                    (255,255,255), 3)

contours = cv.findContours(image_contours, cv.RETR_LIST,
                           cv.CHAIN_APPROX_SIMPLE)[0]

cv.drawContours(image_binary, [max(contours, key = cv.contourArea)],
                -1, (255, 255, 255), -1)

cv.imwrite('LPR.jpg', image_binary)
cv.imshow('LPR', image_binary)
cv.waitKey(0) & 0xFF is 27
cv.destroyAllWindows()
1

Đầu ra của chương trình cải tiến không minh họa rằng các vòng tròn và nhãn màu trắng đang làm sai lệch tỷ lệ khối lượng gốc của chúng tôi:

#!/usr/bin/python37
#Raspberry pi 3B/3B+, 4B, Buster, OpenCV 4.2.0
#Date: 5th April, 2020

import cv2 as cv
import numpy as np

img = cv.imread('organ1.jpg')
image_contours = np.zeros((img.shape[1],
                           img.shape[0], 1),
                          np.uint8)

image_binary = np.zeros((img.shape[1],
                         img.shape[0], 1),
                        np.uint8)

for channel in range(img.shape[2]):
    ret, image_thresh = cv.threshold(img[:, :, channel],
                                     38, 255,
                                     cv.THRESH_BINARY)

    contours = cv.findContours(image_thresh, 1, 1)[0]   
    cv.drawContours(image_contours,
                    contours, -1,
                    (255,255,255), 3)

contours = cv.findContours(image_contours, cv.RETR_LIST,
                           cv.CHAIN_APPROX_SIMPLE)[0]

cv.drawContours(image_binary, [max(contours, key = cv.contourArea)],
                -1, (255, 255, 255), -1)

cv.imwrite('LPR.jpg', image_binary)
cv.imshow('LPR', image_binary)
cv.waitKey(0) & 0xFF is 27
cv.destroyAllWindows()
2

Dưới đây là các hình ảnh nhị phân được tạo ra bởi ngưỡng bổ sung. Lưu ý rằng chúng tôi chưa loại bỏ hoàn toàn các pixel trắng vi phạm. Phác thảo vẫn còn. Tuy nhiên, chúng tôi đã giảm số lượng pixel ngoại lai, điều này sẽ làm cho đầu ra chính xác hơn.

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Ngưỡng hình ảnh thuộc địa vi khuẩn (15 phút)

Trong thư mục hình ảnh

gray_image = skimage.io.imread("data/shapes-02.jpg", as_gray=True)
histogram, bin_edges = np.histogram(gray_image, bins=256, range=(0.0, 1.0))

fig, ax = plt.subplots()
plt.plot(bin_edges[0:-1], histogram)
plt.title("Graylevel histogram")
plt.xlabel("gray value")
plt.ylabel("pixel count")
plt.xlim(0, 1.0)
1, bạn sẽ tìm thấy một hình ảnh có tên
gray_image = skimage.io.imread("data/shapes-02.jpg", as_gray=True)
histogram, bin_edges = np.histogram(gray_image, bins=256, range=(0.0, 1.0))

fig, ax = plt.subplots()
plt.plot(bin_edges[0:-1], histogram)
plt.title("Graylevel histogram")
plt.xlabel("gray value")
plt.ylabel("pixel count")
plt.xlim(0, 1.0)
2.

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Đây là một trong những hình ảnh bạn sẽ làm việc trong thử thách hình thái học ở cuối hội thảo.

  1. Biểu đồ và kiểm tra biểu đồ thang độ xám của hình ảnh để xác định giá trị ngưỡng tốt cho hình ảnh.
  2. Tạo một mặt nạ nhị phân để lại các pixel trong các khuẩn lạc vi khuẩn trên mạng trong khi biến phần còn lại của các pixel trong hình ảnh trên mạng.

Dung dịch

Chúng ta có thể áp dụng một ngưỡng nhị phân đơn giản với ngưỡng

gray_image = skimage.io.imread("data/shapes-02.jpg", as_gray=True)
histogram, bin_edges = np.histogram(gray_image, bins=256, range=(0.0, 1.0))

fig, ax = plt.subplots()
plt.plot(bin_edges[0:-1], histogram)
plt.title("Graylevel histogram")
plt.xlabel("gray value")
plt.ylabel("pixel count")
plt.xlim(0, 1.0)
0 để xóa nhãn và vòng tròn khỏi hình ảnh. Chúng tôi sử dụng mặt nạ nhị phân để đặt các pixel trong hình ảnh mờ thành 0 (màu đen).

#!/usr/bin/python37
#Raspberry pi 3B/3B+, 4B, Buster, OpenCV 4.2.0
#Date: 5th April, 2020

import cv2 as cv
import numpy as np

img = cv.imread('organ1.jpg')
image_contours = np.zeros((img.shape[1],
                           img.shape[0], 1),
                          np.uint8)

image_binary = np.zeros((img.shape[1],
                         img.shape[0], 1),
                        np.uint8)

for channel in range(img.shape[2]):
    ret, image_thresh = cv.threshold(img[:, :, channel],
                                     38, 255,
                                     cv.THRESH_BINARY)

    contours = cv.findContours(image_thresh, 1, 1)[0]   
    cv.drawContours(image_contours,
                    contours, -1,
                    (255,255,255), 3)

contours = cv.findContours(image_contours, cv.RETR_LIST,
                           cv.CHAIN_APPROX_SIMPLE)[0]

cv.drawContours(image_binary, [max(contours, key = cv.contourArea)],
                -1, (255, 255, 255), -1)

cv.imwrite('LPR.jpg', image_binary)
cv.imshow('LPR', image_binary)
cv.waitKey(0) & 0xFF is 27
cv.destroyAllWindows()
3

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Đầu ra của chương trình cải tiến không minh họa rằng các vòng tròn và nhãn màu trắng đang làm sai lệch tỷ lệ khối lượng gốc của chúng tôi:

Dưới đây là các hình ảnh nhị phân được tạo ra bởi ngưỡng bổ sung. Lưu ý rằng chúng tôi chưa loại bỏ hoàn toàn các pixel trắng vi phạm. Phác thảo vẫn còn. Tuy nhiên, chúng tôi đã giảm số lượng pixel ngoại lai, điều này sẽ làm cho đầu ra chính xác hơn.

#!/usr/bin/python37
#Raspberry pi 3B/3B+, 4B, Buster, OpenCV 4.2.0
#Date: 5th April, 2020

import cv2 as cv
import numpy as np

img = cv.imread('organ1.jpg')
image_contours = np.zeros((img.shape[1],
                           img.shape[0], 1),
                          np.uint8)

image_binary = np.zeros((img.shape[1],
                         img.shape[0], 1),
                        np.uint8)

for channel in range(img.shape[2]):
    ret, image_thresh = cv.threshold(img[:, :, channel],
                                     38, 255,
                                     cv.THRESH_BINARY)

    contours = cv.findContours(image_thresh, 1, 1)[0]   
    cv.drawContours(image_contours,
                    contours, -1,
                    (255,255,255), 3)

contours = cv.findContours(image_contours, cv.RETR_LIST,
                           cv.CHAIN_APPROX_SIMPLE)[0]

cv.drawContours(image_binary, [max(contours, key = cv.contourArea)],
                -1, (255, 255, 255), -1)

cv.imwrite('LPR.jpg', image_binary)
cv.imshow('LPR', image_binary)
cv.waitKey(0) & 0xFF is 27
cv.destroyAllWindows()
4

Hướng dẫn how do you make a binary mask in python? - làm cách nào để tạo mặt nạ nhị phân trong python?

Ngưỡng hình ảnh thuộc địa vi khuẩn (15 phút)

Trong thư mục hình ảnh gray_image = skimage.io.imread("data/shapes-02.jpg", as_gray=True) histogram, bin_edges = np.histogram(gray_image, bins=256, range=(0.0, 1.0)) fig, ax = plt.subplots() plt.plot(bin_edges[0:-1], histogram) plt.title("Graylevel histogram") plt.xlabel("gray value") plt.ylabel("pixel count") plt.xlim(0, 1.0) 1, bạn sẽ tìm thấy một hình ảnh có tên gray_image = skimage.io.imread("data/shapes-02.jpg", as_gray=True) histogram, bin_edges = np.histogram(gray_image, bins=256, range=(0.0, 1.0)) fig, ax = plt.subplots() plt.plot(bin_edges[0:-1], histogram) plt.title("Graylevel histogram") plt.xlabel("gray value") plt.ylabel("pixel count") plt.xlim(0, 1.0) 2.

  • Đây là một trong những hình ảnh bạn sẽ làm việc trong thử thách hình thái học ở cuối hội thảo.

  • Biểu đồ và kiểm tra biểu đồ thang độ xám của hình ảnh để xác định giá trị ngưỡng tốt cho hình ảnh.

  • Tạo một mặt nạ nhị phân để lại các pixel trong các khuẩn lạc vi khuẩn trên mạng trong khi biến phần còn lại của các pixel trong hình ảnh trên mạng.

Mặt nạ nhị phân là gì?

Mặt nạ bit chỉ đơn giản là quá trình lưu trữ dữ liệu thực sự dưới dạng bit, trái ngược với việc lưu trữ nó dưới dạng chars/ints/floats.Nó cực kỳ hữu ích để lưu trữ một số loại dữ liệu một cách đơn giản và hiệu quả.Ý tưởng cho mặt nạ bit dựa trên logic boolean.the process of storing data truly as bits, as opposed to storing it as chars/ints/floats. It is incredibly useful for storing certain types of data compactly and efficiently. The idea for bit masking is based on boolean logic.

Làm thế nào để mặt nạ hoạt động trong Python?

Phương thức mặt nạ () thay thế các giá trị của các hàng trong đó điều kiện đánh giá là true.Phương thức mặt nạ () đối diện với phương thức ở đâu ().replaces the values of the rows where the condition evaluates to True. The mask() method is the opposite of the The where() method.

Mặt nạ OpenCV là gì?

Mặt nạ là một kỹ thuật phổ biến để trích xuất khu vực quan tâm (ROI).Trong OpenCV, có thể xây dựng hình dạng mặt nạ tùy ý bằng cách sử dụng chức năng vẽ và hoạt động bitwise.a common technique to extract the Region of Interest (ROI). In openCV, it is possible to construct arbitrary masking shape using draw function and bitwise operation.

Xử lý hình ảnh mặt nạ là gì?

Mặt nạ là một phương pháp xử lý hình ảnh trong đó chúng tôi xác định một 'mảnh hình ảnh' nhỏ và sử dụng nó để sửa đổi một hình ảnh lớn hơn.Mặt nạ là quá trình bên dưới nhiều loại xử lý hình ảnh, bao gồm phát hiện cạnh, phát hiện chuyển động và giảm nhiễu.an image processing method in which we define a small 'image piece' and use it to modify a larger image. Masking is the process that is underneath many types of image processing, including edge detection, motion detection, and noise reduction.