Метод проверки интенсивности пикселей изображения

У меня есть приложение для iPhone на основе OCR, которое принимает изображения в градациях серого и определяет их как черно-белые, чтобы найти текст (используя opencv). Это хорошо работает для изображений с черным текстом на белом фоне. У меня проблема с автоматическим переключением на обратный порог, когда изображение представляет собой белый текст на черном фоне. Существует ли широко используемый алгоритм проверки изображения, чтобы определить, является ли оно светлым текстом на темном фоне или наоборот? Может ли кто-нибудь порекомендовать чистый метод работы? Имейте в виду, я работаю только с изображением в градациях серого с камеры iPhone.

Большое спасибо.


person Kevin_TA    schedule 28.03.2012    source источник
comment
Сравните процент белых пикселей с процентом черных.   -  person Nick Bull    schedule 28.03.2012
comment
Я использую изображение в градациях серого, поэтому я не могу сравнить чистый черный с чистым белым. Я разместил свое решение ниже.   -  person Kevin_TA    schedule 09.04.2012


Ответы (2)


Поскольку на данный момент я имею дело с оттенками серого IplImage, я не мог подсчитать черные или белые пиксели, но должен был подсчитать количество пикселей выше заданного порога «яркости». Я просто использовал граничные пиксели, так как это дешевле и все же дает мне достаточно информации, чтобы принять правильное решение.

IplImage *image;
int sum = 0; // Number of light pixels
int threshold = 135; // Light/Dark intensity threshold

/* Count number of light pixels at border of image. Must convert to unsigned char type to make range 0-255. */
// Check every other pixel of top and bottom
for (int i=0; i<(image->width); i+=2) {
    if ((unsigned char)image->imageData[i] >= threshold) { // Check top
        sum++;
    }
    if ((unsigned char)image->imageData[(image->width)*(image->height)
                       - image->width + i] >= threshold) { // Check bottom
        sum++;
    }
}

//Check every other pixel of left and right Sides
for (int i=0; i<(image->height); i+=2) {
    if ((unsigned char)image->imageData[i*(image->width)] >= threshold) { // Check left
        sum++;
    }
    if ((unsigned char)image->imageData[i*(image->width) + (image->width) - 1] >= threshold) { // Check right
        sum++;
    }
}

// If more than half of the border pixels are light, use inverse threshold to find dark characters
if (sum > ((image->width/2) + (image->height/2))) {
    // Use inverse binary threshold because background is light
}
else {
    // Use standard binary threshold because background is dark
}
person Kevin_TA    schedule 09.04.2012
comment
Вы по-прежнему используете фиксированный порог, который создаст проблемы при изменении освещения или экспозиции. - person Mark Ransom; 09.04.2012
comment
Нет, это просто для того, чтобы определить, светлый это фон или темный. Фактическое двоичное пороговое значение выполняется в отдельном методе, реализующем метод Оцу для адаптивного двоичного порогового значения. - person Kevin_TA; 10.04.2012

Я просматривал каждый пиксель и проверял, яркий он или темный. Если количество темных пикселей больше, чем светлых, необходимо инвертировать изображение.

Посмотрите здесь, как определить яркость: Обнаружение черного пикселя в изображении iOS

И вот как нарисовать перевернутый UIImage:

[imyImage drawInRect:theImageRect blendMode:kCGBlendModeDifference alpha:1.0];
person Thyraz    schedule 28.03.2012