Метод проверки интенсивности пикселей изображения - PullRequest
1 голос
/ 28 марта 2012

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

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

Ответы [ 2 ]

1 голос
/ 09 апреля 2012

Поскольку я имею дело с полутоновым масштабом 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
}
0 голосов
/ 28 марта 2012

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

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

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

[imyImage drawInRect:theImageRect blendMode:kCGBlendModeDifference alpha:1.0];
...