Tăng cường cạnh opencv python

Như đã nói ở trên, một pixel mang 3 giá trị màu, vì trên thực tế mỗi pixel được cấu trúc thành bao gồm 3 pixel phụ. Và pixel cũng không có kích thước vật lý cụ thể, mà nó phụ thuộc vào mật độ pixel. Mỗi pixel chứa được 256 [0-255] giá trị, cho nên về Mặt lý thuyết 3 pixel phụ hiện thị được 256^3 = 16777216 [~16 triệu màu]. Nhưng tất nhiên là mắt người chưa chắc đã phân biệt được 16 triệu màu này

Xử lý hình ảnh bằng Gối và OpenCV

Trong toàn bộ bài viết này mình sẽ sử dụng ảnh này làm ảnh gốc để chỉnh sửa. Phần mã có hơi mì ăn liền cho bạn nào khó tính vui lòng bỏ qua

1. Chuyển ảnh màu sang thang độ xám

Về cơ bản thì thang độ xám [hình trắng đen] là loại ảnh mà tất cả các pixel chỉ mang thông tin về độ sáng, hay nói cách khác là chỉ có thể hiển thị các sắc thái của màu xám [Chế độ độ sáng]. Trong màu RGB không gian, thì màu xám là màu mà các sắc tố Đỏ , Xanh lá cây, Blue có giá trị bằng nhau. Ví dụ màu đỏ là

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.show[]

# Or save it to a file
# new_img.save['rick-morty-L.png']
0 thì nếu ta muốn chuyển nó sang xám thì lấy giá trị trung bình của 3 sub-pixels và tạo thành 1 pixel mới
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.show[]

# Or save it to a file
# new_img.save['rick-morty-L.png']
1

1. 1 Code thủ công

Đầu tiên chúng ta áp dụng lý thuyết ở trên để chỉnh sửa từng pixel cho ảnh gốc để tạo ra ảnh mới

from PIL import Image
img = Image.open['rick-morty.png']
pixels = img.load[]

new_img = Image.new[img.mode, img.size]
pixels_new = new_img.load[]
for i in range[new_img.size[0]]:
    for j in range[new_img.size[1]]:
        r, b, g = pixels[i,j]
        avg = int[round[[r + b + g] / 3]]
        pixels_new[i,j] = [avg, avg, avg, 0]
new_img.show[]

Chúng ta có ảnh gốc được chuyển thành thang độ xám như sau

1. 2 Gối sử dụng

Gối là một bản rẽ nhánh của PIL [Thư viện hình ảnh Python] một thư viện xử lý hình ảnh của Python. Do PIL được phát hành từ năm 2009 và không có bản cập nhật thường xuyên, nên PIL đã được thay thế bằng Gối trên các bản phân phối của Debian và Ubuntu luôn

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.show[]

# Or save it to a file
# new_img.save['rick-morty-L.png']

Kết quả hơi khác nên code thủ công ở trên một chút, ví dụ cái áo màu của Morty ở trên là

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.show[]

# Or save it to a file
# new_img.save['rick-morty-L.png']
2 nhưng ở dưới là
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.show[]

# Or save it to a file
# new_img.save['rick-morty-L.png']
3

2. Thay đổi độ tương phản [contrast]

Để thay đổi độ tương phản của pixel bằng

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.show[]

# Or save it to a file
# new_img.save['rick-morty-L.png']
4 khá đơn giản

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.show[]
    # Or save it to file
    # new_img.save['rick-morty-%s.png' % i]

Trong đó, yếu tố là một giá trị để kiểm tra độ tương phản, 1. 0 is same same original, but low than 1. 0 là giảm độ tương phản vân vân và mây

yếu tố - Một giá trị dấu phẩy động kiểm soát việc tăng cường. yếu tố 1. 0 luôn trả về một bản sao của hình ảnh gốc, các yếu tố thấp hơn có nghĩa là ít màu hơn [độ sáng, độ tương phản, v.v.] và các giá trị cao hơn sẽ nhiều hơn. Không có hạn chế về giá trị này

Mình cũng không rõ Gối thay đổi độ tương phản bằng cách nào, nhưng về lý thuyết chung thì tăng/giảm tương phản là làm tối [làm tối] nhưng pixel có giá trị dưới mức nào đó và làm sáng [làm sáng] các pixel đó . Độ chênh lệch này sẽ làm tăng hoặc giảm sự tương phản

Các bạn có thể xem thêm công thức thay đổi độ tương phản của pixel tại đây, nhưng kết quả từ công thức này không ổn lắm nên mình không đăng kết quả tại đây

3. Thay đổi độ sáng [brightness]

Để thay đổi độ sáng của ảnh bằng Gối cũng rất đơn giản, ta làm như sau

________số 8

Để thay đổi độ sáng của pixel bằng cách thủ công cũng khá đơn giản, ta chỉ cần tăng hoặc giảm giá trị của từng pixel được nhận, chỉ cần lưu ý

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.show[]

# Or save it to a file
# new_img.save['rick-morty-L.png']
5 giá trị đó sao cho nó nằm trong khoảng 0-255 là được

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.show[]

# Or save it to a file
# new_img.save['rick-morty-L.png']
0

4. Làm mờ [Gaussian blur]

Gaussian blur Phương pháp làm mờ hình ảnh sử dụng chức năng Gussian để giảm nhiễu và chi tiết trên bức ảnh

Giải thích rút gọn thì cái ma trận 3x3 trong hình được gọi là

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.show[]

# Or save it to a file
# new_img.save['rick-morty-L.png']
6. Chúng ta áp dụng cái filter như hình cho từng pixel thì cuối cùng chúng ta sẽ có một hình bị làm mờ. To going to giải thích chi tiết ở các bài sau

* Nguồn Xử lý ảnh số

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.show[]

# Or save it to a file
# new_img.save['rick-morty-L.png']
2

5. Làm tối 4 góc [vignette] sử dụng OpenCV và numpy

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.show[]

# Or save it to a file
# new_img.save['rick-morty-L.png']
3

Add-on

Phần này không liên quan đến việc xử lý hình ảnh ở trên

Tìm các cạnh bằng phương pháp Canny [Canny edge detect]

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.show[]

# Or save it to a file
# new_img.save['rick-morty-L.png']
4

Draw Countour of Picture

Contour trong xử lý ảnh là những đường nối các điểm liền kề nhau tạo nên hình dáng của vật thể trong ảnh [không phải contour trong trang điểm]. Nó là một công cụ rất hữu ích trong việc nhận dạng và định danh các vật thể trong hình [phát hiện và nhận dạng đối tượng]

Chủ Đề