2017-08-20 18 views
6

Câu hỏi của tôi tóm tắt: được phân phối 1d bằng Python, làm cách nào để có thể xác định các vùng của phân phối đó có kiểu sine giống như nhấp nhô?Python: Xác định các mẫu nhấp nhô trong phân phối 1d

Tôi đang làm việc để xác định hình ảnh trong quá trình quét trang các tài liệu lịch sử. Những hình ảnh này về cơ bản luôn có chiều rộng toàn bộ trong phạm vi quét (tức là, về cơ bản chúng không bao giờ được đính kèm với văn bản). Điều này khiến tôi tin rằng giải pháp đơn giản nhất là xóa các vùng quét trang có chứa dòng văn bản.

Sử dụng đoạn mã dưới đây, người ta có thể đọc một hình ảnh vào bộ nhớ và đo sáng điểm ảnh tổng hợp cho mỗi hàng ngang bức hình, trên xuống dưới, chuyển một hình ảnh đầu vào cho cốt truyện dưới đây:

import matplotlib.mlab as mlab 
import matplotlib.pyplot as plt 
from scipy.ndimage import imread 
import numpy as np 
import sys 

img = imread(sys.argv[1]) 
row_sums = list([(sum(r)/len(r)) for r in img ]) 

# the size of the returned array = size of row_sums input array 
window_size = 150 
running_average_y = np.convolve(row_sums, np.ones((window_size,))/window_size, mode='same') 

# plot the y dimension pixel distribution 
plt.plot(running_average_y) 
plt.show() 

Input image: cốt truyện

enter image description here

Output:

enter image description hereVới phân bố này, bây giờ tôi muốn xác định các khu vực của đường cong có mô hình nhấp nhô thông thường mà người ta thấy trong phần ba đầu tiên và cuối cùng của cốt truyện (nói gần). Những người khác có ý tưởng về cách tiếp cận nhiệm vụ đó không?

Lúc đầu, tôi đã thử lắp một mô hình tuyến tính cho toàn bộ phân phối 1d, nhưng điều đó không thành công vì tất cả các loại lý do. Bây giờ tôi nghĩ rằng có thể có ý nghĩa để thử và điều chỉnh một thứ gì đó giống như sóng sin đến các đoạn đường cong, nhưng điều đó có vẻ như quá mức cần thiết. Những người khác có ý tưởng về cách tốt nhất để tiếp cận nhiệm vụ này không? Bất kỳ đề xuất hoặc thông tin chi tiết nào cũng sẽ được đánh giá cao!

+0

Bạn có thể muốn hỏi qua tại https://dsp.stackexchange.com/ – wwii

+0

Cái gì mà không mảnh-khôn ngoan miền tần số như [DTFT] (https: //en.wikipedia. org/wiki/Discrete-time_Fourier_transform) hoặc [Wavelet transform] (https://en.wikipedia.org/wiki/Wavelet_transform)? Không phải là một chuyên gia, nhưng có vẻ như một cái gì đó có thể giúp đỡ. –

+0

Có thể bạn muốn làm khớp nối spline theo thứ tự phù hợp. –

Trả lời

4

Điều này không trả lời câu hỏi của bạn nhưng có thể giải quyết được vấn đề của bạn. Làm mịn tổng số hàng ẩn giấu thực tế rằng các dòng văn bản trong hình ảnh của bạn được phân cách bằng không gian trắng - như được mong đợi cho một kiểu in di động.

Bạn có thể sử dụng khoảng trắng làm dấu phân tách để phân vùng hình ảnh thành các khối. Trong hầu hết các trường hợp, một khối tương ứng với một dòng đơn. Các khối rất lớn tương ứng với hình ảnh.

enter image description here

import sys 
import numpy as np 
import matplotlib.pyplot as plt 

MIN_BLOCK_SIZE = 100 # pixels 

img = plt.imread(sys.argv[1]) 

# find blank rows 
row_sums = np.mean(img, axis=1) 
threshold = np.percentile(row_sums, 75) 
is_blank = row_sums > threshold 

# find blocks between blank rows 
block_edges = np.diff(is_blank.astype(np.int)) 
starts, = np.where(block_edges == -1) 
stops, = np.where(block_edges == 1) 
blocks = np.c_[starts, stops] 

# plot steps 
fig, axes = plt.subplots(3,1, sharex=True, figsize=(6.85, 6)) 
axes[0].plot(row_sums) 
axes[0].axhline(threshold, c='r', ls='--') 
axes[1].plot(is_blank) 
for (start, stop) in blocks: 
    if stop - start > MIN_BLOCK_SIZE: 
     axes[2].axvspan(start, stop, facecolor='red') 
plt.show() 
+0

điều này thật tuyệt vời! Tôi nhận ra sau khi đăng câu hỏi của mình rằng tôi có dữ liệu OCR xác định hộp giới hạn của từng từ được xác định trong hình ảnh, vì vậy người ta có thể trừ những từ ma trận pixel và nhanh chóng tìm thấy hình ảnh kết quả, nhưng cách tiếp cận của bạn vượt trội hơn vì nó không yêu cầu dữ liệu OCR. Cảm ơn một lần nữa vì điều này! – duhaime

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