Как я могу обнаружить горизонтальные черные линии, используя ImageMagick? - PullRequest
2 голосов
/ 15 апреля 2010

Итак, у меня есть электронная таблица в формате TIFF. В этом есть некоторая однородность ... например, все ширины столбцов одинаковы. Я хочу ограничить этот лист этими известными значениями ширины столбцов и в основном создать множество маленьких графических файлов, по одному для каждой ячейки, запустить OCR для них и сохранить его в базе данных. Проблема в том, что горизонтальные линии имеют разную высоту, поэтому мне нужно использовать какую-то команду графической библиотеки, чтобы проверить, имеет ли каждый пиксель одинаковый цвет (то есть черный). И если так, то я знаю, что достиг ограничителя высоты для ячейки. Как бы я поступил так? (Я использую RMagick)

Ответы [ 2 ]

1 голос
/ 15 апреля 2010

Использовать image#get_pixel: http://www.simplesystems.org/RMagick/doc/image2.html#get_pixels Предупреждение. Эти документы старые, поэтому они могли измениться в более новых версиях.Посмотрите на ваши собственные rdocs, используя $ gem server, предполагая, что они имеют rdocs.

image#rows дает вам высоту изображения, тогда вы можете сделать что-то вроде (не проверено):

def black_line?(pixels)
  pixels.each do |pixel| 
    unless pixel.red == 0 && pixel.green == 0 && pixel.blue == 0
      return false
    end
  end
  true
end 

black_line_heights = []
height = image.rows
width = image.columns
height.times do |y|
  pixels = image.get_pixel(0,y,width,1)
  black_line_heights << y if black_line?(pixels)
end 

Пожалуйста, имейте в виду, что я не уверен в API.Глядя на старые документы, и я не могу проверить это сейчас.Но похоже, что общий подход вы бы выбрали.Кстати, предполагается, что границы строк имеют толщину 1 пиксель.Если нет, измените 1 на фактическую толщину, и этого может быть достаточно, чтобы он работал так, как вы ожидаете.

0 голосов
/ 16 апреля 2010

Ehsanul сделал это почти правильно ... вызов get_pixels, который принимает в качестве аргументов x, y, w, h и возвращает массив этих пикселей. Если размер равен 1, вы получите хороший массив из одного элемента.

Поскольку черный цвет в документе может варьироваться, я немного изменил метод Эхсанула, чтобы определить, были ли последовательные пиксели примерно одинакового цвета. После примерно 100 пикселей это, вероятно, строка:

  def solid_line?(pixels, opt={}, black_val = 10)
    last_pixel = nil
     thresh =  opt[:threshold].blank? ? 4 : opt[:threshold]

     pixels.each do |pix|     
       pixel = [pix.red, pix.green, pix.blue]
       if last_pixel != nil            
         return false if pixel.reject{|p| (p-last_pixel[pixel.index(p)]).abs < thresh && p < black_val}.length > 0
       end
       last_pixel = pixel
     end
     true


    end
...