Làm cách nào để tôi xây dựng lại văn bản từ một hình ảnh chỉ bằng các hoạt động hình thái?


16

Tôi muốn xây dựng lại văn bản từ hình ảnh sau đây tốt nhất có thể. Phần khó khăn là tôi muốn làm điều đó chỉ bằng cách sử dụng các thao tác hình thái trên hình ảnh

Tôi đã thử sử dụng xói mòn, giãn nở, mở và đóng nhưng kết quả không được tốt lắm.

Điều này thậm chí có thể?

nhập mô tả hình ảnh ở đây


Sự giãn nở trông giống như bước đầu tiên rõ ràng để làm phẳng các cạnh mờ?
Paul R

Vâng, tôi nghĩ rằng đây là bước đầu tiên của mọi sự kết hợp tôi đã thử.

2
Tôi nghĩ bạn cần xác định vấn đề của bạn nhiều hơn. Ví dụ, nếu bạn muốn nói làm thế nào bạn có thể làm cho nó dễ đọc hơn, thì một chút giãn nở có lẽ là đủ. Nếu bạn muốn xây dựng lại chính xác nó trông như thế nào trước bất kỳ quá trình biến dạng nào, thì điều đó là không thể, bởi vì thuật toán hình thái của bạn không có kiến ​​thức về hình dạng của phông chữ cụ thể được sử dụng.
so12311

Để làm cho nó dễ đọc hơn, tôi đã tạo một imdilate với [0 1 0; 1 1 1; 0 1 0]. Tôi đang tìm kiếm một cái gì đó sẽ làm cho văn bản trông rất gần với bản gốc.
Jackobsen

Câu trả lời:


6

Nếu bạn sẵn sàng thêm / bớt, v.v. hình ảnh được biến đổi hình thái, bạn có thể đếm xem có bao nhiêu pixel tín hiệu trong vùng lân cận của mỗi pixel và ngưỡng dựa trên số đó.

img = imread('http://i.stack.imgur.com/wicpc.png');

n = false(3);n(4) = 1;
s = false(3);s(6) = 1;
w = false(3);w(2) = 1;
e = false(3);e(8) = 1;

%# note that you could convolve with a cross instead
fourNeighbourCount = imerode(img,n) + imerode(img,s) + imerode(img,w) + imerode(img,3) + img;

nhập mô tả hình ảnh ở đây

%# require at least two neighbours
img = fourNeighbourCount > 1;

nhập mô tả hình ảnh ở đây

Nếu sau đó bạn kết hợp với mặt nạ 3x3 có một lỗ ở giữa, bạn có thể nhận được một cái gì đó như thế này:

nhập mô tả hình ảnh ở đây


3

Đây là một vấn đề khá thú vị để giải quyết! Hãy thử một bộ lọc trung bình . Xem tài liệu tham khảo ở đâyở đây để biết thêm chi tiết.

Mặc dù tôi không đặt tay để mô phỏng vấn đề của bạn, đây là một gợi ý. Cảm giác ruột của tôi nói rằng nó có thể mang lại cho bạn lợi ích lớn bởi vì, nó được biết là chống lại loại tiếng ồn muối-n-pepper. Trong trường hợp của bạn, hình ảnh có thêm các chấm trắng xung quanh viền sẽ được chuyển thành toàn màu trắng hoặc đen hoàn toàn tùy thuộc vào phía nào của bảng chữ cái. Đây là cách nó trông sau khi lọc trung bình:

nhập mô tả hình ảnh ở đây


1

Nếu vì một lý do nào đó, bạn bị giới hạn trong việc sử dụng các hoạt động hình thái, thì bạn có thể xem xét sử dụng "sơ đồ bỏ phiếu" của các hoạt động gần theo định hướng.

Một vấn đề với các hoạt động hình thái là chúng không thực sự tính đến tính định hướng. Đối với pixel trung tâm, một vùng lân cận như thế này

1 0 0
1 1 0
0 1 1

thực sự không khác gì một khu phố như thế này

0 1 0
1 1 0
1 1 0

Điều đó có thể gây ra vấn đề vì sự giãn nở và xói mòn không thiên về hướng khi bạn có thể thích chúng. Vì vậy, một điều bạn có thể làm là tìm hoạt động hình thái sai lệch định hướng thích hợp nhất bằng cách sử dụng các nhân như thế này:

1 1 0   1 0 0   1 0 0
0 1 0   1 1 0   1 1 0
0 1 1   0 1 1   0 1 1 . . .

Điều này sẽ tốt hơn với 5 x 5 hạt nhân, nhưng tôi nghĩ ý tưởng này đã đủ rõ ràng. Về cơ bản, ý tưởng về hạt nhân phát hiện góc được kéo dài một chút để nó là hạt nhân phát hiện phân đoạn dòng. Bạn cũng có thể sử dụng nó để tìm đường cong phù hợp nhất:

0 0 0 1 1
0 0 1 1 0
0 1 1 0 0 
0 0 1 1 0
0 0 0 1 1

Rõ ràng điều này dẫn đến một số lượng lớn hạt nhân, nhưng nếu ý tưởng cơ bản hoạt động cho thấy lời hứa cho bạn thì có một cách để tối ưu hóa kỹ thuật để tìm thấy hạt nhân phù hợp nhất trong một lần chạy.

Trong mọi trường hợp, nếu bạn sử dụng nhiều hạt nhân và một số logic, mỗi thao tác tại (x, y) đòi hỏi nhiều tính toán hơn một bước hình thái truyền thống:

  1. Tại mỗi pixel (x, y), áp dụng từng toán tử hình thái. Đối với mỗi toán tử, tính cả kết quả của phép toán hình thái VÀ mức độ đầu vào khớp với hạt nhân. ("Độ" = số pixel phù hợp)
  2. Chọn kết quả hình thái cho hạt nhân phù hợp nhất với cấu hình pixel bật / tắt thực tế.

Kích thước của hạt nhân phải phù hợp với kích thước của đầu vào. Thay vì sử dụng kernel lớn hơn, bạn có thể sử dụng kernel "lây lan" để giảm số lượng thao tác. Hạt nhân sau chỉ là hạt nhân 3 x 3 với bán kính lớn hơn 1.

1 0 0 0 0 0 0
0 0 0 0 0 0 0
1 0 0 1 0 0 0
0 0 0 0 0 0 0
1 0 0 0 0 0 1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.