2017-10-12 2 views
0

J'ai une image avec un fond presque lisse avec quelques lignes supplémentaires. Je veux convertir l'image de l'espace colorimétrique RVB en espace colorimétrique LAB et ensuite faire la moyenne de la partie "L" des pixels. Mais avant de convertir, je veux supprimer des lignes supplémentaires ou ignorer d'une façon ou d'une autre les pixels des lignes en faisant la moyenne de la partie "L". Y a-t-il un algorithme pour le faire?supprimer des lignes supplémentaires dans l'image

Voici un exemple des images que j'ai.

enter image description here

+1

Que voulez-vous voulez supprimer et que voulez-vous exactement à préserver? (Veuillez ne pas répondre "lignes supplémentaires".) –

+0

Comme vous le voyez, il y a une couleur dominante en arrière-plan. Il y a aussi des formes vues comme des lignes (je veux dire des pixels plus sombres). Je dois supprimer ces parties plus sombres. – mohammad

+0

Veuillez faire attention que les lignes supplémentaires ne sont pas nécessairement plus sombres. Je veux supprimer les pixels autres que la couleur dominante. – mohammad

Répondre

1

Une option est de calculer le gradient (Sobel par exemple) et éviter de faire l'accumulation où l'ampleur du gradient est significatif. Après le commentaire de @Paul, il sera intéressant de voir l'influence du niveau de seuil sur la moyenne calculée.

enter image description here

0

J'utilise ImageMagick comme votre autre question. Cela vous donnera un masque de tous les pixels qui diffèrent de plus de 5% de leur environnement (c'est le 0.05 dans la partie -fx). Il fonctionne en chargeant l'image en pierre, en la copiant et en rendant la copie floue pour supprimer les détails locaux. Il calcule ensuite la différence absolue entre la copie originale et le flou et définit le pixel à 1 si la différence est supérieure à 5%, il fixe d'autre à 0:

convert stone.jpg -colorspace gray \(+clone -blur x10 \) -fx "abs(u-v)>0.05?1:0" mask.png 

enter image description here

expérience avec la modification du 0.05 et de voir ce que tu penses.


Ceci vous indiquera combien de pixels dans le masque sont blancs. Elle repose sur la moyenne étant de somme luminosités de pixels divisé par le nombre de pixels et sachant que tous les pixels sont soit 0 ou 1:

convert mask.png -format "%[fx:int(mean*w*h)]" info: 
6155 

Cela noircissent tous les pixels masqués. Il fonctionne en chargeant à la fois la pierre et le masque, inversant le masque puis, à chaque position de pixel, en choisissant le plus sombre des deux images - il choisira donc le noir partout où le masque est blanc et choisira la pierre partout ailleurs:

convert stone.jpg \(mask.png -negate \) -compose darken -composite nolines.png 

enter image description here

+0

Pouvez-vous s'il vous plaît expliquer plus sur l'algorithme? Je vais écrire l'algorithme dans opencv. – mohammad

+0

Je peux essayer. Avec quelles étapes vous battez-vous? Essayez d'ajouter la balise 'OpenCV' à votre question en passant. –

0

En ImageMagick, si vous faites les pixels à ignorer transparent, vous pouvez obtenir la moyenne de tous les pixels non transparents à l'aide -Scale 1x1 !.Par exemple, à partir des deux images ci-dessus:

enter image description here

enter image description here

Alors d'abord mettre le masque dans le canal alpha, puis l'échelle le résultat à un pixel, tourner alpha déshabillerons et la couleur du pixel:

convert image.jpg mask.png -alpha off -compose copy_opacity -composite -scale 1x1! -alpha off -format "%[pixel:u.p{0,0}]" info: 
srgb(231,214,198) 

Pour vérifier, permet de faire un swatch:

convert -size 100x100 xc:"srgb(231,214,198)" swatch.png 

enter image description here

Ou nous pouvons recolorer l'image originale:

convert image.jpg -fill "srgb(231,214,198)" -colorize 100 newimage.png 

enter image description here