Обнаружение цветов допуска после изменения размера изображения

У меня есть изображение, которое я пытаюсь циклически находить в пикселях.

Итак, если это слой 1000px x 1000px, то я вижу это изображение (я просто показываю фрагмент изображения, надеюсь, этого будет достаточно для понимания):

введите здесь описание изображения

Но если я изменю размер своего изображения, например, до 300 x 300 пикселей, оно будет выглядеть так (также просто покажите фрагмент изображения):

введите здесь описание изображения

Итак, как вы можете видеть после уменьшения размера, у нас есть дополнительные пиксели не только фиолетового и зеленого, но и что-то вроде градиента между двумя цветами. Но я пишу программу, которая пытается определить положение пикселей для зеленого и фиолетового, поэтому я просто использую 2 цвета, чтобы найти подходящее положение. Без изменения размера моя программа обнаруживает это хорошо, но после изменения размера возникает проблема с определением подходящего положения цвета.

В фотошопе, если вы используете, например, допуск 100 и снимаете галочку сглаживания, он работает хорошо и находит правильное положение даже с градиентом.

Как реализовать толерантность в моем коде. Так, например, у меня есть зеленый цвет, который мне нужно сравнить со всеми цветами допуска. И если пиксель на 100 процентов толерантен к зеленому, то программа должна считать, что пиксель подключен к зеленому цвету.

Что я имею в виду. Например, у меня есть цвет RGB (0, 255, 0), и я хочу найти к нему все допуски. В данном случае для зелени.

Или, например, если у меня есть RGB (100, 255, 50), то мне нужно найти для него все допуски цветов.

Я полагаю, здесь должен быть диапазон, который я могу установить, и цвета для проверки допустимого цвета.

Кроме того, я использую необработанные данные для цикла всех пикселей. Итак, я могу получить RGBA:

            float red   = (rawData[byteIndex]     * 1.0) / 255.0;
            float green = (rawData[byteIndex + 1] * 1.0) / 255.0;
            float blue  = (rawData[byteIndex + 2] * 1.0) / 255.0;
            float alpha = (rawData[byteIndex + 3] * 1.0) / 255.0;

Таким образом, обнаружение сплошного цвета работает идеально, но у меня есть вопрос, как распознать этот градиент и решить, связан ли цвет с зеленым или фиолетовым.

Здесь также мой предыдущий вопрос, как зациклить пиксель.


person Matrosov Alexander    schedule 03.03.2015    source источник
comment
какой алгоритм вы используете для изменения размера изображения?   -  person holex    schedule 03.03.2015
comment
@holex, я использую этот stackoverflow.com/questions/2658738/, но я не знаю, если есть какой-либо алгоритм изменения размера с сохранением тех же цветов, мне не нужен градиент между частями.   -  person Matrosov Alexander    schedule 03.03.2015


Ответы (1)


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

UIGraphicsBeginImageContext(newSize);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetInterpolationQuality(context, kCGInterpolationNone);
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
person Ian MacDonald    schedule 03.03.2015
comment
спасибо за ответ, вот мой цикл, как я нашел позицию и нужный пиксель в проблеме производительности изображения png"> stackoverflow.com/questions/28609108/ Итак, это просто сравнение цвета, но мне нужно знать, как я могу найти все пиксели допуска и сравнить, нужен ли им пиксель. Итак, как видите, я просто сравниваю шестнадцатеричный цвет из своего словаря с пикселем, полученным из необработанных данных, но вместо этого мне нужно использовать не только шестнадцатеричный цвет, но и диапазон. - person Matrosov Alexander; 03.03.2015
comment
Я явно не понимаю вашего вопроса. Вы не просто пытаетесь изменить размер изображения? - person Ian MacDonald; 03.03.2015
comment
Я хочу изменить размер изображения, но он похож на фотошоп с ближайшими соседними жесткими краями. так что у меня нет дополнительного градиента. только жесткие края. - person Matrosov Alexander; 03.03.2015
comment
Вы не просто используете drawInRect для этого изменения размера? - person Ian MacDonald; 03.03.2015
comment
хорошо, кажется, работает отлично, я просто вижу четкие края вместо градиента. - person Matrosov Alexander; 03.03.2015