2015-06-08 3 views
-1

Я начинаю изучать openCV и иметь вопрос об этом.Извлечь из изображения меньшего изображения

Моя цель - распознать капчу.
Сначала я должен предварительно обработать изображение.

Существует пример капчи here

Так проблема заключается в том, чтобы обрезать символы с изображения и поместить его в 2D массив (растровый).

+0

Это легко сделать с переработки сырья и без библиотеки участвует. Вы разрешаете мне публиковать независимое от библиотеки решение о том, как это сделать? – Malina

+0

@Malina ok, go. Будет хорошо – Carrybubbles

ответ

2

Автоматическое обнаружение Partition


Первое, что вам нужно сделать, это создать массив фильтра цвета фона. Это будет массив, содержащий цвета, которые встречаются в фоновом режиме. Для этого вы можете просто взять офсетную область 20x20 или оставить ее как пользовательскую опцию в зависимости от вашей проектной точки зрения.

typedef unsigned char Pixel [3]; 
typedef *Pixel PixelArray; 

// Function to return offset byte of x/y coordinate 
int bmp_get_offset (int width, int x, int y) 
{ 
    int w = width; 
    const int channels = 3; 
    const int bpp = 8; 
    const int single = (channels * bmpp)/8; 
    const int offset = 54; 
    int rowsize = w * single; 
    int pixAddress; 

    if(rowsize % 4 != 0) rowsize += 4 - (rowsize % 4); 
    pixAddress = offset + yp * rowsize + xp * single; 

    return pixAddress; 
} 

// Function to return specific area (pseudo-code) 
PixelArray bmp_get_area (FILE * bmp, int x, int y, int w, int h) 
{ 
    PixelArray buffer = buffer_new(bmp); // sets image into a memory-allocated buffer 
    PixelArray area [h * w]; 
    const int src_width = *((int*)&buffer[(0x12)]); 

    for(int iWidth = 0; iWidth < w; iWidth++) 
     for(int iHeight = 0; iHeight < h; iHeight++) 
      area[iHeight * src_width + iWidth] = buffer[bmp_get_offset(src_width, x + iWidth, y + iHeight)]; 

    return area; 
} 

Ну, это не так много псевдокодов.


Теперь, когда у вас есть фильтр, вы можете ограничить внешние пиксели. Теперь вам нужно вертикальное сканирование растра. Или просто вертикальное сканирование. По всему изображению captcha. Каждый пиксель вертикальной линии будет дополнительно проверен, если он соответствует некоторому цвету из уже полученного area. Если все пиксели линии (размер которой имеет высоту изображения) возвращают положительный результат, если флажок близок или совпадает с цветом area, индексный указатель будет увеличиваться так, чтобы мы имели место, где заканчивается последний символ. enter image description here


Edit 1 В течение 3 секунд я позументная цветовые кривые изображения, в результате простого фона: enter image description here

Так что соответственно упрощает процесс фильтрации довольно много. Магия цветовых кривых, которую я сделал, на самом деле является только регулировкой яркости/контрастности, которая, возможно, самая простая обработка цвета, которую вы можете реализовать (после инвертирования).


Я могу периодически редактировать, чтобы уточнить еще. Это, безусловно, даст вам хорошую практику. Реальная практика.

Doc:

  • BMP File Format (более чем достаточно информации для вас, чтобы начать работать с растровыми изображениями Наиболее важным из них является структура битовой карты, которая представляет собой сочетание BMPINFOHEADER и DIBHEADER.).
  • Tesseract OCR (альтернатива, которая будет делать все для вас. Тем не менее, если вам решить ваши проблемы с простым решением, она не сделает вас лучшим программистом)
+0

+1 для предоставления ссылки на «Tesseract OCR» библиотеку распознавания текста. /Ваш/APD происходит, ОЧЕНЬ хороший и хитрый тоже. – Edenia

+0

Да, я не очень подробно рассказывал об этом ... но при необходимости. – Malina

Смежные вопросы