2010-02-17 26 views
5

Tôi đã triển khai một số phương pháp mã hóa thích ứng, chúng sử dụng một cửa sổ nhỏ và tại mỗi pixel, giá trị ngưỡng được tính toán. Có vấn đề với những phương pháp: Nếu chúng ta chọn kích thước cửa sổ quá nhỏ, chúng tôi sẽ nhận được hiệu ứng này (Tôi nghĩ lý do là vì kích thước cửa sổ nhỏ) alt text http://i.piccy.info/i4/3d/bc/773b7df74ff7dadfd11c09372b7e.jpegNgưỡng thích ứng Tác động xấu của Binarization

Ở góc trên bên trái có một ảnh gốc , góc trên bên phải - kết quả ngưỡng toàn cầu. Dưới cùng bên trái - ví dụ về chia hình ảnh cho một số phần (nhưng tôi đang nói về phân tích pixel của hình ảnh nhỏ xung quanh, ví dụ cửa sổ có kích thước 10X10). Vì vậy, bạn có thể thấy kết quả của các thuật toán như vậy ở hình dưới cùng bên phải, chúng tôi có một khu vực màu đen, nhưng nó phải có màu trắng. Có ai biết cách cải thiện thuật toán để giải quyết vấn đề này không?

Trả lời

2

Có rất nhiều nghiên cứu đang diễn ra trong lĩnh vực này, nhưng tiếc là tôi không có liên kết tốt để cung cấp.

Một ý tưởng, có thể hoạt động nhưng tôi chưa thử nghiệm, là cố gắng ước tính các biến thể ánh sáng và sau đó loại bỏ điều đó trước khi làm tròn (đây là một thuật ngữ tốt hơn "binarization"). Vấn đề sau đó được chuyển từ phương pháp điều chỉnh thích ứng để tìm ra một mô hình ánh sáng tốt.

Nếu bạn biết gì về nguồn sáng thì bạn có thể xây dựng mô hình từ đó.

Nếu không, một hack nhanh có thể hoạt động là áp dụng bộ lọc thông thấp thực sự nặng vào hình ảnh của bạn (làm mờ nó) và sau đó sử dụng nó làm mô hình chiếu sáng của bạn. Sau đó, tạo ra một hình ảnh khác biệt giữa bản gốc và phiên bản mờ và ngưỡng đó.

EDIT: Sau khi thử nghiệm nhanh, có vẻ như "hack nhanh" của tôi không thực sự hoạt động. Sau khi suy nghĩ về nó tôi không phải là rất ngạc nhiên khi một trong hai :)

I = someImage 
Ib = blur(I, 'a lot!') 
Idiff = I - Idiff 
It = threshold(Idiff, 'some global threshold') 

EDIT 2 Got một ý tưởng khác mà có thể làm việc tùy thuộc vào cách hình ảnh của bạn được tạo ra. Hãy thử ước lượng mô hình chiếu sáng từ vài dòng đầu tiên trong hình ảnh:

  1. Lấy hàng N đầu tiên trong hình ảnh
  2. Tạo một hàng trung bình từ N thu thập hàng. Bạn biết có một hàng làm mô hình nền của bạn.
  3. Đối với mỗi hàng trong hình ảnh, trừ hàng mẫu nền (hàng trung bình).
  4. Ngưỡng hình ảnh kết quả.

Thật không may tôi đang ở nhà mà không có bất kỳ công cụ tốt nào để kiểm tra điều này.

+0

Bạn có thể giải thích chi tiết hơn không! Điều gì có nghĩa là "loại bỏ trước khi đập"? Làm thế nào để loại bỏ? Sau đó, một điều nữa: Làm mờ rất nhiều và lấy sự khác biệt và sau đó đập với ngưỡng toàn cầu - nó sẽ tạo hiệu ứng gì cho hình ảnh tốt? Tôi có nghĩa là cho hình ảnh mà không bị hư hại sau khi phương pháp ngưỡng thích ứng? – maximus

+0

Xem cập nhật: Tôi không nghĩ phương pháp của tôi có thể hoạt động. Tôi nghĩ bạn sẽ phải sử dụng một số phương pháp nâng cao hơn. –

+0

Dù sao, Cảm ơn bạn đã trả lời! Hy vọng ở đây sẽ có nhiều câu trả lời hơn! – maximus

2

Dường như bạn đang làm sai lệch hình thức thích ứng. Hình ảnh của bạn trông như thể bạn chia hình ảnh thành các khối nhỏ, tính ngưỡng cho mỗi khối và áp dụng ngưỡng đó cho toàn bộ khối. Điều đó sẽ giải thích hiện vật "hộp". Thông thường, khả năng thích ứng thresholding có nghĩa là tìm một ngưỡng cho mỗi pixel riêng biệt, với một cửa sổ riêng biệt tập trung xung quanh điểm ảnh.

Một gợi ý khác là xây dựng mô hình toàn cầu cho ánh sáng của bạn: Trong hình ảnh mẫu của bạn, tôi chắc chắn bạn có thể phù hợp với mặt phẳng (trong không gian X/Y/Brightness) tách các pixel thành pixel sáng hơn (foreground) và tối hơn so với mặt phẳng đó (nền). Sau đó, bạn có thể phù hợp với các mặt phẳng riêng biệt với nền và các pixel nền trước, ngưỡng sử dụng giá trị trung bình giữa các mặt phẳng này một lần nữa và cải thiện phân đoạn lặp đi lặp lại. Làm thế nào tốt mà sẽ làm việc trong thực tế phụ thuộc vào cách sét của bạn có thể được mô hình hóa với một mô hình tuyến tính.

Nếu đối tượng thực tế bạn cố gắng phân đoạn là "mỏng hơn" (bạn đã nói gì đó về mã vạch trong nhận xét), bạn có thể thử thao tác mở/đóng đơn giản để có mô hình chiếu sáng. (ví dụ: đóng hình ảnh để loại bỏ các điểm ảnh nền trước, sau đó sử dụng [đóng ảnh + X] làm ngưỡng).

Hoặc, bạn có thể thử tính năng thay đổi trung bình để nhận các pixel nền trước và nền sau cùng độ sáng. (Cá nhân, tôi sẽ thử cái đầu tiên)

1

Bạn có ánh sáng rất không đồng đều và đối tượng khá lớn (do đó, không có cách dễ dàng phổ quát nào để trích xuất nền và sửa không đồng nhất). Điều này về cơ bản có nghĩa là bạn không thể sử dụng toàn bộ hệ thống thresholding toàn cầu, bạn cần có sự thúc đẩy thích nghi.

Bạn muốn thử tính năng binarization Niblack. Mã Matlab có sẵn tại đây http://www.uio.no/studier/emner/matnat/ifi/INF3300/h06/undervisningsmateriale/week-36-2006-solution.pdf (trang 4). Có hai thông số bạn sẽ phải điều chỉnh bằng tay: kích thước cửa sổ (N trong mã trên) và trọng lượng.

1

Cố gắng áp dụng một ngưỡng thích nghi địa phương sử dụng thủ tục này:

  1. dây leo hình ảnh với một bình hoặc trung bình lọc
  2. trừ hình ảnh ban đầu từ convolved một
  3. ngưỡng những hình ảnh khác biệt

Phương pháp ngưỡng thích ứng cục bộ chọn một ngưỡng riêng cho mỗi pixel.

Tôi đang sử dụng phương pháp này rộng rãi và nó hoạt động tốt với hình ảnh có nền không đồng nhất.

Các vấn đề liên quan