2015-03-03 1 views
1

J'ai une image que j'essaie de faire défiler pour trouver la position des pixels.Détection des couleurs de tolérance après le redimensionnement de l'image

Donc, si elle est couche 1000px x 1000px je vois cette image (je viens de montrer fragment d'image, j'espère que ce sera suffisant pour comprendre):

enter image description here

Mais si je remets à la côte mon image pour par exemple à 300px x 300px il ressemble à ceci (aussi montrer que fragment d'image):

enter image description here

comme vous pouvez le voir après le calibrage vers le bas, nous avons un des pixels supplémentaires non seulement violet et vert, mais quelque chose comme dégradé entre deux couleurs. Mais j'écris un programme qui essaie de trouver la position des pixels pour le vert et le violet, donc j'utilise juste 2 couleurs pour trouver la position appropriée. Sans redimensionner mon programme, je le détecte bien, mais après le redimensionnement, il y a un problème avec la détection de la position de couleur appropriée. Dans photoshop si vous utilisez par exemple la tolérance 100 et décochez l'anti-aliasing cocher cela fonctionne bien et trouve la bonne position même avec gradient.

Comment implémenter la tolérance dans mon code. Par exemple, j'ai la couleur verte que j'ai besoin de comparer avec toutes les couleurs de tolérance. Et si le pixel 100 pour cent tolère le vert, le programme devrait supposer que le pixel est connecté à la couleur verte.

Ce que je veux dire. Par exemple j'ai la couleur RVB (0, 255, 0) et je veux y trouver toute la tolérance. Dans ce cas pour le vert.

Ou par exemple si j'ai RVB (100, 255, 50) alors j'ai besoin de trouver toutes les couleurs de tolérance pour cela.

Je suppose que voici une gamme que je peux définir et les couleurs pour vérifier la couleur de tolérance.

Comme je supplémentaire, j'utilise des données brutes pour faire défiler tous les pixels. Donc, je peux obtenir 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; 

travail couleur unie donc la détection parfaite, mais je question de savoir comment reconnaître que la pente et décider si la couleur reliée au vert ou violet pièce.

Here is also ma question précédente comment cycle pixel.

+0

quel algorithme utilisez-vous pour redimensionner l'image? – holex

+0

@holex, j'utilise celui-ci http://stackoverflow.com/questions/2658738/the-simplest-way-to-resize-an-uiimage, mais je ne sais pas s'il y a un algorithme pour changer la taille en sauvegardant le De la même couleur, je n'ai pas besoin de dégradé entre les pièces. –

Répondre

3

Il semble que vous rencontriez un problème d'interpolation ici sur votre redimensionnement. Si vous désactivez l'interpolation, vous n'aurez aucune nouvelle couleur dans votre image.

UIGraphicsBeginImageContext(newSize); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSetInterpolationQuality(context, kCGInterpolationNone); 
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 
UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
+0

merci pour la réponse voici mon cycle comment j'ai trouvé la position et le pixel nécessaire http://stackoverflow.com/questions/28609108/cycling-pixels-in-png-image-perfomance-issue Donc, cela juste en comparant la couleur, mais J'ai besoin de savoir comment je peux trouver tous les pixels de tolérance et de comparer si elle avait besoin de pixels. Donc, comme vous pouvez le voir, je compare juste la couleur hexadécimale de mon dictionnaire avec le pixel que je reçois des données brutes, mais je dois utiliser non seulement la couleur hexadécimale, mais aussi la portée. –

+0

Je ne comprends pas clairement votre question. N'essayez-vous pas de redimensionner une image? –

+0

Je veux redimensionner l'image, mais comme ressembler à photoshop avec les bords les plus proches voisins. alors je n'ai pas de gradient supplémentaire. juste des bords durs. –