Ngưỡng thích ứng OpenCV trong Python với cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Ngưỡng thích ứng OpenCV trong Python với cv2.adaptiveThreshold ()

Giới thiệu

Lập ngưỡng là một kỹ thuật đơn giản và hiệu quả để thực hiện phân đoạn cơ bản trong một hình ảnh và để mã hóa nó (biến nó thành một hình ảnh nhị phân) trong đó pixel là 0 or 1 (Hoặc 255 nếu bạn đang sử dụng số nguyên để đại diện cho chúng).

Thông thường, bạn có thể sử dụng tính năng tạo ngưỡng để thực hiện phân đoạn nền trước đơn giản trong một hình ảnh và nó tổng hợp thành các biến thể trên một kỹ thuật đơn giản cho mỗi pixel:

if pixel_value > threshold:
    pixel_value = MAX
else:
    pixel_value = 0

Định ngưỡng đơn giản có các vấn đề rõ ràng và yêu cầu đầu vào khá nguyên sơ, điều này làm cho nó không thực tế cho nhiều trường hợp sử dụng. Vi phạm chính là ngưỡng chung được áp dụng cho toàn bộ hình ảnh, trong khi hình ảnh hiếm khi đủ đồng nhất để các ngưỡng chung hoạt động, trừ khi chúng là nhân tạo.

Ngưỡng toàn cục sẽ hoạt động tốt khi phân tách các ký tự trong một cuốn sách đen trắng, trên các trang được quét. Ngưỡng toàn cầu rất có thể sẽ không thành công trên ảnh điện thoại của cùng một trang đó, vì điều kiện ánh sáng có thể thay đổi giữa các phần của trang, làm cho điểm giới hạn toàn cầu trở nên quá nhạy cảm với dữ liệu thực.

Để chống lại điều này - chúng tôi có thể sử dụng địa phương ngưỡng, sử dụng một kỹ thuật được gọi là ngưỡng thích ứng. Thay vì xử lý tất cả các phần của hình ảnh theo cùng một quy tắc, chúng tôi có thể thay đổi ngưỡng cho từng khu vực địa phương điều đó có vẻ phù hợp với nó. Điều này làm cho ngưỡng một phần bất biến đối với những thay đổi về ánh sáng, tiếng ồn và các yếu tố khác. Mặc dù hữu ích hơn nhiều so với ngưỡng toàn cục, nhưng bản thân việc lập ngưỡng là một kỹ thuật hạn chế, cứng nhắc và được áp dụng tốt nhất để trợ giúp xử lý trước hình ảnh (đặc biệt là khi xác định hình ảnh để loại bỏ), thay vì phân đoạn.

Đối với các ứng dụng tinh vi hơn đòi hỏi ngữ cảnh, bạn nên sử dụng các kỹ thuật nâng cao hơn, bao gồm cả học sâu, đã thúc đẩy những tiến bộ gần đây trong thị giác máy tính.

Ngưỡng thích ứng với OpenCV

Hãy tải vào một hình ảnh có điều kiện ánh sáng thay đổi, trong đó một phần của hình ảnh được lấy nét nhiều hơn phần khác, với hình ảnh được chụp từ một góc. Một bức ảnh tôi chụp về Harold McGee's "Về Thực phẩm và Nấu ăn" sẽ phục vụ tuyệt vời!

img = cv2.imread('book.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)

Bây giờ, bằng cách sử dụng ngưỡng thông thường, chúng ta có thể cố gắng tách các chữ cái ra khỏi nền, vì có sự khác biệt rõ ràng về màu sắc giữa chúng. Tất cả màu giấy sẽ được coi là nền. Vì chúng tôi không thực sự biết ngưỡng nên là bao nhiêu - hãy áp dụng phương pháp của Otsu để tìm ra giá trị tốt, dự đoán rằng hình ảnh có phần hai phương thức (chủ yếu bị chi phối bởi hai màu):

img = cv2.imread('book.jpg')


gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)

ret, mask = cv2.threshold(blurred, 0, 255, cv2.THRESH_OTSU)
print(f'Threshold: {ret}')

fig, ax = plt.subplots(1, 2, figsize=(12, 5))
ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(mask, cv2.COLOR_BGR2RGB))

Hãy cùng xem kết quả:

Ngưỡng thích ứng OpenCV trong Python với cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Ầm ĩ. Phần bên trái của văn bản chủ yếu bị mờ đi, bóng xung quanh rãnh nước hoàn toàn ăn mất một phần của hình ảnh và văn bản quá bão hòa! Đây là một hình ảnh "trong tự nhiên" và các quy tắc chung như ngưỡng toàn cầu không hoạt động tốt. Ngưỡng nên là bao nhiêu? Nó phụ thuộc vào một phần của hình ảnh!

Sản phẩm cv2.adaptiveThreshold() phương pháp cho phép chúng tôi thực hiện chính xác điều này:

cv2.adaptiveThreshold(img, 
                      max_value, 
                      adaptive_method, 
                      threshold_method, 
                      block_size, 
                      C)

Sản phẩm adaptive_method có thể là một cv2.ADAPTIVE_THRESH_MEAN_C or cv2.ADAPTIVE_THRESH_GAUSSIAN_C, Nơi C là đối số cuối cùng bạn đặt. Cả hai phương pháp này đều tính toán ngưỡng theo các vùng lân cận của pixel được đề cập, trong đó block_size cho biết số lượng hàng xóm được xem xét (diện tích của khu vực lân cận).

ADAPTIVE_THRESH_MEAN_C lấy trung bình của những người hàng xóm và khấu trừ C, trong khi ADAPTIVE_THRESH_GAUSSIAN_C lấy tổng trọng số gaussian của các hàng xóm và trừ đi C.

Xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

Nó cũng cho phép bạn đặt chiến lược mã hóa nhị phân, nhưng chỉ giới hạn ở THRESH_BINARYTHRESH_BINARY_INVvà việc thay đổi giữa chúng sẽ chuyển đổi hiệu quả đâu là “nền” và đâu là “nền trước”.

Phương thức chỉ trả về mặt nạ cho hình ảnh - không phải mã trả về và mặt nạ. Hãy thử phân đoạn các ký tự trong cùng một hình ảnh như trước đây, bằng cách sử dụng ngưỡng thích ứng:


img = cv2.imread('book.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)


mask = cv2.adaptiveThreshold(blurred, 
                              255, 
                              cv2.ADAPTIVE_THRESH_MEAN_C, 
                              cv2.THRESH_BINARY, 
                              31, 
                              10)


fig, ax = plt.subplots(1, 2, figsize=(12, 5))
ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(mask, cv2.COLOR_BGR2RGB))
plt.tight_layout()

Điều này dẫn đến một hình ảnh rõ ràng hơn nhiều:

Ngưỡng thích ứng OpenCV trong Python với cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Lưu ý: Sản phẩm block_size đối số phải là một số không đồng đều.

Theo cách tương tự, chúng ta có thể áp dụng ngưỡng gaussian:

mask = cv2.adaptiveThreshold(blurred, 
                              255, 
                              cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
                              cv2.THRESH_BINARY, 
                              31, 
                              10)

Cuối cùng cũng tạo ra một hình ảnh khá hài lòng:

Ngưỡng thích ứng OpenCV trong Python với cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Cả kích thước khối (khu vực lân cận) và C là siêu tham số để điều chỉnh ở đây. Hãy thử các giá trị khác nhau và chọn giá trị phù hợp nhất với hình ảnh của bạn. Nói chung, ngưỡng gaussian ít nhạy cảm hơn với tiếng ồn và sẽ tạo ra hình ảnh mờ hơn một chút, rõ ràng hơn, nhưng điều này thay đổi và phụ thuộc vào đầu vào.

Hạn chế của Ngưỡng thích ứng

Với ngưỡng thích ứng, chúng tôi có thể tránh được giới hạn tổng thể về ngưỡng, nhưng nó vẫn tương đối cứng nhắc và không hoạt động tốt đối với các đầu vào nhiều màu sắc. Ví dụ: nếu chúng tôi tải vào hình ảnh một cái kéo và một bộ dụng cụ nhỏ có màu sắc khác nhau, thì ngay cả ngưỡng thích ứng cũng sẽ có vấn đề khi phân đoạn nó đúng, với một số tính năng tối nhất định được phác thảo, nhưng không có toàn bộ đối tượng được xem xét:

Ngưỡng thích ứng OpenCV trong Python với cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Nếu chúng tôi điều chỉnh kích thước khối và C, chúng ta có thể làm cho nó coi các bản vá lớn hơn là một phần của cùng một đối tượng, nhưng sau đó gặp phải vấn đề với việc tạo kích thước hàng xóm quá toàn cầu, quay trở lại các vấn đề bao quát tương tự với ngưỡng toàn cầu:

Ngưỡng thích ứng OpenCV trong Python với cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Kết luận

Trong những năm gần đây, phân đoạn nhị phân (như những gì chúng tôi đã làm ở đây) và phân đoạn đa nhãn (nơi bạn có thể mã hóa số lớp tùy ý) đã được mô hình hóa thành công với mạng học sâu, mạnh mẽ và linh hoạt hơn nhiều. Ngoài ra, họ có thể mã hóa ngữ cảnh toàn cầu và cục bộ thành các hình ảnh mà họ đang phân đoạn. Nhược điểm là - bạn cần dữ liệu để đào tạo họ, cũng như thời gian và kiến ​​thức chuyên môn.

Để tạo ngưỡng đơn giản, nhanh chóng, bạn có thể sử dụng OpenCV và khắc phục một số hạn chế bằng cách sử dụng tính năng tạo ngưỡng thích ứng thay vì chiến lược tạo ngưỡng toàn cầu. Để phân đoạn chính xác, cấp độ sản xuất, bạn sẽ muốn sử dụng mạng thần kinh.

Tiến xa hơn - Học sâu thực tế cho thị giác máy tính

Bản tính ham học hỏi của bạn khiến bạn muốn tiến xa hơn? Chúng tôi khuyên bạn nên kiểm tra Khóa học: “Học sâu thực tế cho thị giác máy tính với Python”.

Ngưỡng thích ứng OpenCV trong Python với cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Một khóa học thị giác máy tính khác?

Chúng tôi sẽ không phân loại các chữ số MNIST hoặc thời trang MNIST. Họ đã phục vụ phần của họ từ lâu lắm rồi. Quá nhiều tài nguyên học tập đang tập trung vào bộ dữ liệu cơ bản và kiến ​​trúc cơ bản trước khi để các kiến ​​trúc hộp đen nâng cao gánh vác gánh nặng về hiệu suất.

Chúng tôi muốn tập trung vào sự làm sáng tỏ, tính thực tiễn, sự hiểu biết, trực giácdự án thực tế. Muốn học làm thế nào Bạn có thể làm nên điều khác biệt? Chúng tôi sẽ đưa bạn đi từ cách bộ não của chúng ta xử lý hình ảnh để viết một bộ phân loại học sâu cấp độ nghiên cứu cho bệnh ung thư vú đến mạng lưới học tập sâu "ảo giác", dạy cho bạn các nguyên tắc và lý thuyết thông qua công việc thực tế, trang bị cho bạn bí quyết và công cụ để trở thành chuyên gia ứng dụng học sâu để giải quyết vấn đề thị giác máy tính.

Có gì bên trong?

  • Các nguyên tắc đầu tiên của tầm nhìn và cách máy tính có thể được dạy để "nhìn"
  • Các tác vụ và ứng dụng khác nhau của thị giác máy tính
  • Các công cụ giao dịch sẽ giúp công việc của bạn dễ dàng hơn
  • Tìm kiếm, tạo và sử dụng bộ dữ liệu cho thị giác máy tính
  • Lý thuyết và ứng dụng của Mạng nơ ron chuyển đổi
  • Xử lý sự thay đổi tên miền, đồng xuất hiện và các sai lệch khác trong tập dữ liệu
  • Chuyển giao Học tập và tận dụng thời gian đào tạo cũng như các tài nguyên tính toán của người khác vì lợi ích của bạn
  • Xây dựng và đào tạo một máy phân loại ung thư vú tiên tiến nhất
  • Cách áp dụng liều lượng hoài nghi lành mạnh vào các ý tưởng chủ đạo và hiểu được hàm ý của các kỹ thuật được áp dụng rộng rãi
  • Hình dung “không gian khái niệm” của ConvNet bằng t-SNE và PCA
  • Các nghiên cứu điển hình về cách các công ty sử dụng kỹ thuật thị giác máy tính để đạt được kết quả tốt hơn
  • Đánh giá mô hình thích hợp, hình dung không gian tiềm ẩn và xác định sự chú ý của mô hình
  • Thực hiện nghiên cứu miền, xử lý tập dữ liệu của riêng bạn và thiết lập các thử nghiệm mô hình
  • Các kiến ​​trúc tiên tiến, sự phát triển của các ý tưởng, điều gì làm cho chúng trở nên độc đáo và cách thực hiện chúng
  • KerasCV - một thư viện WIP để tạo các mô hình và đường ống hiện đại
  • Cách phân tích cú pháp và đọc các bài báo và tự thực hiện chúng
  • Lựa chọn mô hình tùy thuộc vào ứng dụng của bạn
  • Tạo một đường dẫn học máy từ đầu đến cuối
  • Phong cảnh và trực giác khi phát hiện đối tượng với R-CNN, RetinaNets, SSD và YOLO nhanh hơn
  • Phân đoạn phiên bản và ngữ nghĩa
  • Nhận dạng đối tượng trong thời gian thực với YOLOv5
  • Đào tạo máy dò đối tượng YOLOv5
  • Làm việc với Máy biến áp bằng KerasNLP (thư viện WIP dành cho ngành công nghiệp)
  • Tích hợp Transformers với ConvNets để tạo phụ đề cho hình ảnh
  • Ngủ sâu
  • Tối ưu hóa mô hình Deep Learning cho thị giác máy tính

Dấu thời gian:

Thêm từ xếp chồng lên nhau