Computer Vision

Masking, Splitting and Merging, Color spaces

MASKING

Sử dụng mask cho phép chúng ta tập trung vào phần hình ảnh cần xử lý. Ví dụ: khi xây dựng hệ thống nhận dạng khuôn mặt, chúng ta chỉ quan tâm đến phần hình ảnh nào có chứa mặt người và sử dụng mask để hiển thị phần hình ảnh đó, không quan tâm đến phần còn lại của bức ảnh.

Có 4 bitwise operation: AND, OR, XOR, NOT tương ứng với các function sau: cv2.bitwise_and(), cv2.bitwise_or(), cv2.bitwise_xor() cv2.bitwise_not().

Bitwise operations operate in a binary manner and are represented as grayscale images. A given pixel is turned “off” if it has a value of zero, and it is turned “on” if the pixel has a value greater than zero.

Example 1:

import numpy as np
import cv2

image = cv2.imread("image_path")
cv2.imshow("Original", image)
# 8-bit single channel mask
mask = np.zeros(image.shape[:2], dtype="uint8")
(cX, cY) = (image.shape[1]//2, image.shape[0]//2)

cv2.circle(mask, (cX, cY), 100, 255, -1)
masked = cv2.bitwise_and(image, image, mask=mask)
cv2.imshow("Mask", mask)
cv2.imshow("Mask Applied to Image", masked)
cv2.waitKey(0)

Ở example 1, mình tạo mask là một ma trận 2 chiều, có số hàng và cột tương ứng với của image. Sau đó mình vẽ một hình tròn màu trắng có tâm (cX, cY), bán kính 100 pixels lên mask. Function cv2.bitwise_and(image, image, mask=mask) sẽ thực hiện phép AND giữa ma trận image và chính nó tại những pixel tương ứng có giá trị lớn hơn 0 trong ma trận mask.

mask

Chúng ta cũng có thể sử dụng mask như một bộ lọc màu bằng cách tạo ma trận 3 chiều mask (rows, cols, channels) tương ứng với image cần lọc. Vẽ lên ma trận mask một hình nào đó (chẳng hạn là hình tròn như example 1) với màu cần lọc (ví dụ màu đỏ (0,0,255)) và sử dụng function cv2.bitwise_and(image, mask).

Example 2:

import numpy as np
import cv2

image = cv2.imread("image_path")
cv2.imshow("Original", image)
# 8-bit 3 channels mask
mask = np.zeros(image.shape, dtype="uint8")
(cX, cY) = (image.shape[1]//2, image.shape[0]//2)

cv2.circle(mask, (cX, cY), 100, (0, 0, 255), -1)
masked = cv2.bitwise_and(image, mask)
cv2.imshow("Mask", mask)
cv2.imshow("Mask Applied to Image", masked)
cv2.waitKey(0)

redmasking

Ngoài ra, chúng ta có thể sử dụng bitwise operator để loại bỏ phần hình ảnh không mong muốn.

Example 3: Image cutting with bitwise operator

import cv2
import numpy as np
import argparse

image = cv2.imread("opencvlogo.png")
cv2.imshow("Image", image)
mask = np.zeros(image.shape, dtype="uint8")
mask[image.shape[0]-70:, :] = 255

cv2.imshow("Mask", mask)
cv2.imshow("Or", cv2.bitwise_or(image, mask))

cv2.waitKey(0)

Output:
mask

Với kết quả trên chúng ta thấy rằng, bằng cách áp dụng bitwise operator OR, phần chữ OpenCV đã được loại bỏ khỏi bức ảnh. Tùy theo từng trường hợp cụ thể mà chúng ta sẽ áp dụng bitwise AND, OR hoặc XOR.


SPLITTING AND MERGING CHANNELS

Màu sắc của hình ảnh gồm nhiều channel: Red, Green, Blue. Khi truy cập pixel với numpy, chúng ta sẽ nhận được các thông số màu sắc này, chú ý là openCV dùng hệ màu BGR. Ngoài ra chúng ta có thể tách các channels của hình ảnh thành các phần riêng biệt với function cv2.split(image).

Example 4:

import numpy as np
import cv2

image = cv2.imread("image_path")
(B, G, R) = cv2.split(image)

cv2.imshow("Red", R)
cv2.imshow("Green", G)
cv2.imshow("Blue", B)
cv2.waitKey(0)

merged = cv2.merge((B,G,R))
cv2.imshow("Merged", merged)
cv2.waitKey(0)
cv2.destroyAllWindows()

split

Hình ảnh gốc gồm 3 channels, sau khi tách channel, các biến B, G, R (single channel) sẽ biểu diễn hình ảnh tương ứng với cường độ của từng channel. Màu càng sáng chứng tỏ cường độ càng cao. Với kết quả nhận được, ta biết rằng cường độ của RED channel là thấp nhất, cường độ của BLUE channel là cao nhất.

Chúng ta cũng có thể ghép các channel với nhau bằng function cv2.merge([B, G, R]).

Example 5:

import numpy as np
import cv2

image = cv2.imread("image_path")
(B, G, R) = cv2.split(image)

zero = np.zeros(image.shape[:2], dtype="uint8")
cv2.imshow("Red", cv2.merge([zero, zero, R]))
cv2.imshow("Green", cv2.merge([zero, G, zero]))
cv2.imshow("Blue", cv2.merge([B, zero, zero]))
cv2.waitKey(0)

merge

Trong ví dụ này, sau khi splitting, chúng ta ghép 1 channel bất kỳ với 2 channel còn lại có cường độ là 0, nói một cách khác, chúng ta đã lọc lấy một channel và kết quả nhận được ở cửa sổ Red tương đồng với kết quả của example 2.


COLOR SPACES

While RGB is easy to understand (especially when you’re first getting started in computer vision), it’s unintuitive when defining exact shades of a color if you need to define a particular range of colors (useful when tracking objects in a video stream based on color appearance).

The HSV color space tends to be more intuitive in terms of actually defining a particular color (or range), but it doesn’t do a great job of representing how humans see and interpret color.

Then we have the L*a*b* color space — this color space tries to mimic the methodology in which humans see and interpret color. This implies that the Euclidean distance between two arbitrary colors in the L*a*b* color space have actual perceptual meaning.

The addition of the perceptual meaning property makes the L*a*b* color space less intuitive and easy to understand than RGB or HSV, but because of the perceptual meaning property, we often use it in computer vision.

Để áp dụng color space chúng ta sử dụng function:

cv2.cvtColor(image, cv2.COLOR_BGR2GRAY | cv2.BGR2HSV | cv2.COLOR_BGR2LAB)

Example 6:

import numpy as np
import cv2

image = cv2.imread("image_path")
cv2.imshow("Original", image)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("Gray", gray)

hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
cv2.imshow("HSV", hsv)

lab = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
cv2.imshow("L*a*b", lab)
cv2.waitKey(0)

colorspaces


SUMMARY

Chúng ta đã tìm hiểu qua kỹ thuật masking, splitting & merging cũng như các color spaces thường dùng trong Image Processing và Computer Vision. Cảm ơn các bạn đã theo dõi bài viết của mình.

Thân ái.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s