12/08/2018, 16:34

OpenCV With Python Part 6

Chào mừng các bạn đả quay lại với tutorial này. Trong bài hướng dẫn lần này, tôi sẽ giới thiệu về ngưỡng . Vậy ngưỡng là gì ? Chúng ta sẽ bắt đầu tìm hiểu về nó nhé. Khi xử lý trực tiếp ảnh từ không gian màu (RGB, HSI..) hoặc ảnh xám (gray) đôi khi ta phải tiếp nhận một số lượng lớn thông tin từ ...

Chào mừng các bạn đả quay lại với tutorial này. Trong bài hướng dẫn lần này, tôi sẽ giới thiệu về ngưỡng . Vậy ngưỡng là gì ? Chúng ta sẽ bắt đầu tìm hiểu về nó nhé.

Khi xử lý trực tiếp ảnh từ không gian màu (RGB, HSI..) hoặc ảnh xám (gray) đôi khi ta phải tiếp nhận một số lượng lớn thông tin từ ảnh. Điều này có thể gây khó khăn cho việc xây dựng thuật toán và làm giảm tốc dộ xử lý . Vì thế có một lớp thuật toán phân ngưỡng (threshold) để chuyển ảnh đầu vào (ảnh màu hoặc ảnh xám) về không gian ảnh nhị phân (chỉ gồm 2 màu) nhằm làm đơn giản hóa quá trình xử lý.

Ý tưởng ngưỡng là để tiếp tục đơn giản hóa dữ liệu thị giác để phân tích chúng. Đối với mỗi bức ảnh hay video thì thứ nhất, bạn có thể chuyển sang màu xám, nhưng sau đó bạn phải xem xét rằng màu xám vẫn có ít nhất 255 giá trị. Bây giờ ta cần chia tách chúng ra thành 2 thế giới là trắng và đen. Đó là cách mà mình có thể làm ở mức cơ bản nhất, chuyển đổi mọi thứ sang màu trắng hoặc đen, dựa trên giá trị ngưỡng. Giả sử chúng ta muốn ngưỡng là 125 (trong số 255), thì mọi thứ từ 125 trở xuống sẽ được chuyển thành 0, hoặc màu đen, và mọi thứ trên 125 sẽ được chuyển đổi sang 255 hoặc bằng trắng. Nếu bạn chuyển sang màu xám như bạn thường thấy thì đó chính là vô vàn các điểm ảnh gồm màu trắng và đen. Nếu bạn không chuyển sang màu xám, bạn sẽ nhận được hình ảnh ngưỡng, nhưng sẽ có màu sắc.

Bây giờ tôi sẽ trình bày nhiều ví dụ và các loại ngưỡng khác nhau ở đây để minh họa cho điều này. Chúng tôi sẽ sử dụng hình ảnh dưới đây làm hình ảnh ví dụ của chúng tôi, nhưng bạn có thể sử dụng hình ảnh của riêng mình:

Hình ảnh chụp thiếu sáng từ một cuốn sách là một ví dụ tuyệt vời và lý do tại sao người ta dùng ngưỡng. Thứ nhất, nền đã thực sự không có màu trắng ở tất cả bố cục của bức ảnh, tất cả mọi thứ là mờ, nhưng mọi thứ không như một bản cố định mà khác nhau trong các chi tiết. Một số bộ phận đủ ánh sáng để dễ đọc, trong khi một số khác thì khá tối và đòi hỏi phải tập trung khá nhiều. Trước tiên, hãy thử chỉ là một ngưỡng đơn giản:

retval, threshold = cv2.threshold(img, 10, 255, cv2.THRESH_BINARY)

Ngưỡng nhị phân là ngưỡng "either or" đơn giản, ở đó các điểm ảnh là 255 hoặc 0. Trong nhiều trường hợp, điều này sẽ là màu trắng hoặc đen, nhưng chúng tôi đã để lại hình ảnh được tô màu như lúc đầu, do đó có thể vẫn còn màu. Tham số đầu tiên ở đây là hình ảnh. Tham số tiếp theo là ngưỡng, chúng ta chọn 10. Tiếp theo là giá trị tối đa mà chúng ta chọn là 255. Và cuối cùng chúng ta có loại ngưỡng mà ta chọn là THRESH_BINARY. Thông thường, một ngưỡng ở mức 10 từ 0 đến 255 sẽ là một phần rất nhỏ. Nhưng ở đây tôi chọn 10, bởi vì đây là hình ảnh có độ sáng thấp nên tôi chọn một số thấp. Thông thường một cái gì đó khoảng 125-150 có lẽ sẽ làm việc tốt nhất.

import cv2
import numpy as np

img = cv2.imread('bookpage.jpg')
retval, threshold = cv2.threshold(img, 12, 255, cv2.THRESH_BINARY)
cv2.imshow('original',img)
cv2.imshow('threshold',threshold)
cv2.waitKey(0)
cv2.destroyAllWindows()

Result:

CHúng ta bắt đầu nhìn bức ảnh một cách đơn giản hơn, chúng ta có thể đọc được các chử nhanh hơn nhiều rồi, nhưng chúng ta vẫn bỏ lỡ nhiều ngữ cảnh ở đây. Tiếp theo, chúng ta có thể lấy thử ngưỡng thích nghi, sẽ cố gắng để thay đổi ngưỡng, và hy vọng chúng ta có thể làm rỏ bức ảnh hơn nhiều nữa.

import cv2
import numpy as np

th = cv2.adaptiveThreshold(grayscaled, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 115, 1)
cv2.imshow('original',img)
cv2.imshow('Adaptive threshold',th)
cv2.waitKey(0)
cv2.destroyAllWindows()

Có một phiên bản ngưỡng khác mà bạn có thể làm, được gọi là ngưỡng của Otsu. Nó không phục vụ chúng ta tốt ở đây, nhưng tôi vẩn giới thiệu thêm cho bạn biết:

retval2,threshold2 = cv2.threshold(grayscaled,125,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.imshow('original',img)
cv2.imshow('Otsu threshold',threshold2)
cv2.waitKey(0)
cv2.destroyAllWindows()

Trong hướng dẫn tiếp theo, chúng tôi thảo luận về lọc màu sắc.

http://docs.opencv.org/ https://techmaster.vn/ https://pythonprogramming.net/

0