Xử lý ảnh bằng pycharm

Ý định ban đầu mình định viết một bài dài kể hươu kể nai về xử lý hình ảnh, nhưng rốt cuộc thấy có vẻ không hữu ích bằng ví dụ cụ thể bằng Python.

Đây là ảnh gốc dùng làm ví dụ trong toàn bộ bài viết này

Xử lý ảnh bằng pycharm

Chuyển ảnh màu sang Grayscale

from PIL import Image
img = Image.open("rick-morty.png")

# If you want a greyscale image, simply convert it to the L (Luminance) mode:
new_img = img.convert('L')
new_img.save('rick-morty-l.png')

Xử lý ảnh bằng pycharm

Chuyển ảnh màu sang Halftone

from PIL import Image
img = Image.open("rick-morty.png")

# black and white image
new_img = img.convert('1')
new_img.save('rick-morty-1.png')

Xử lý ảnh bằng pycharm

Thay đổi độ tương phản (Contrast)

from PIL import Image, ImageEnhance
# PIL accesses images in Cartesian co-ordinates, so it is Image[columns, rows]
img = Image.open("rick-morty.png")

# Enhance constrast
enhancer = ImageEnhance.Contrast(img)
for i in range(1, 8):
    factor = i / 4.0
    new_img = enhancer.enhance(factor)
    new_img.save('rick-morty-%s.png' % i)

Xử lý ảnh bằng pycharm

Thay đổi độ sáng (Brightness)

from PIL import Image, ImageEnhance
# PIL accesses images in Cartesian co-ordinates, so it is Image[columns, rows]
img = Image.open("rick-morty.png")

enhancer = ImageEnhance.Brightness(img)
new_img = enhancer.enhance(1.8)
# Darker
# new_img = enhancer.enhance(0.8)
new_img.save("rick-morty-brightness.png")

Xử lý ảnh bằng pycharm

Làm mờ (Gaussian blur)

from PIL import Image, ImageFilter
# PIL accesses images in Cartesian co-ordinates, so it is Image[columns, rows]
img = Image.open("rick-morty.png")

new_img = img.filter(ImageFilter.GaussianBlur(radius=20))
new_img.save("rick-morty-gaussian-blur.png")

Xử lý ảnh bằng pycharm

Làm tối 4 góc (Vignette)

import cv2
import numpy as np

img = cv2.imread('rick-morty.png')
rows, cols = img.shape[:2]

# generating vignette mask using Gaussian kernels
kernel_x = cv2.getGaussianKernel(cols, 200)
kernel_y = cv2.getGaussianKernel(rows, 200)
kernel = kernel_y * kernel_x.T
mask = 255 * kernel / np.linalg.norm(kernel)
output = np.copy(img)

# applying the mask to each channel in the input image
for i in range(3):
    output[:, :, i] = output[:, :, i] * mask

cv2.imwrite('rick-morty-vig.png', output)

Xử lý ảnh bằng pycharm

Tìm các cạnh bằng phương pháp Canny (Canny edge detection)

import cv2

img = cv2.imread('rick-morty.png', 0)
edges = cv2.Canny(img, 100, 200)
cv2.imwrite('rick-morty-edges.png', edges)

Xử lý ảnh bằng pycharm

Vẽ countour của ảnh

import numpy as np
import cv2

img = cv2.imread('rick-morty.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY)
contours = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2]
for contour in contours:
    cv2.drawContours(img, contour, -1, (0, 255, 0), 3)

cv2.imwrite('rick-morty-contour.png', img)

Xử lý ảnh bằng pycharm

Nhận diện gương mặt

Link down haarcascade_frontalface_default.xml, cái này là training data set dùng để nhận diện gương mặt bằng Haar Cascade classifier.