Maison  >  Article  >  développement back-end  >  Code d'algorithme de filtre d'image implémenté dans Ruby

Code d'algorithme de filtre d'image implémenté dans Ruby

小云云
小云云original
2017-12-05 14:38:251789parcourir

Les filtres sont désormais largement utilisés dans nos vies, et nous les aborderons également dans le développement. Cet article partagera avec vous plusieurs algorithmes de filtrage d'image implémentés à l'aide de Ruby, notamment en niveaux de gris, binaires et négatifs. C'est très simple et pratique, les amis dans le besoin peuvent s'y référer.

Image originale


1. Algorithme en niveaux de gris

La couleur de chaque pixel dans une couleur. photo La valeur est un mélange de valeurs de rouge, de vert et de bleu. Il existe de nombreuses valeurs de rouge, de vert et de bleu, donc la valeur de couleur du pixel peut également avoir plusieurs valeurs de couleur. images en couleur, tandis que les photos en niveaux de gris Il n'y a que 256 couleurs. La méthode de traitement générale consiste à définir les trois valeurs de canal RVB de la valeur de couleur de l'image pour qu'elles soient identiques, de sorte que l'effet d'affichage de l'image soit gris.

Il existe généralement trois algorithmes pour le traitement des niveaux de gris :

  1. Méthode maximale : c'est-à-dire la nouvelle valeur de couleur R=G=B=Max(R, G, B ), L’image traitée par cette méthode semble avoir une valeur de luminosité élevée.

  2. Méthode moyenne : c'est-à-dire la nouvelle valeur de couleur R=G=B=(R+G+B)/3, l'image traitée de cette manière est très douce

  3. Méthode de moyenne pondérée : c'est-à-dire la nouvelle valeur de couleur R=G=B=(R*Wr+G*Wg+B*Wb). Généralement, parce que l'œil humain a des sensibilités différentes aux différentes couleurs, le les poids des trois valeurs de couleur sont différents. De manière générale, le vert est le plus élevé, le rouge est le deuxième et le bleu est le plus bas. Les valeurs les plus raisonnables sont Wr = 30 %, Wg = 59 % et Wb = 11. %

Ce qui suit est l'implémentation Ruby moyenne pondérée de la méthode de valeur :


 #灰度化图片
 #取RGB三色平均值
 def self.grey(bmp)
  for i in 0 .. bmp.height - 1
   for j in 0 .. bmp.width - 1
    rgb = bmp.getRGB(i, j)
    grey = rgb.r.to_f * 0.3+rgb.g.to_f *0.59 +rgb.b.to_f * 0.11.to_i
    bmp.setRGB(i, j, RGB.new(grey, grey, grey))
   end
  end
 end

Effet niveaux de gris :


2. Binarisation

La binarisation de l'image consiste à définir la valeur de gris des pixels de l'image sur 0 ou 255, c'est-à-dire pour que l'image entière apparaisse évidemment en noir et blanc. Tous les pixels dont l'échelle de gris est supérieure ou égale au seuil sont considérés comme appartenant à un objet spécifique, et leur valeur d'échelle de gris est de 255, sinon ces pixels sont exclus de la zone de l'objet, et leur valeur d'échelle de gris est de 0, ce qui indique l'arrière-plan ou superficie d'objet exceptionnelle.

La binarisation d'images est souvent utilisée dans les applications de reconnaissance d'images telles que le piratage des codes de vérification

#二值化图片
 #小于一定阈值设为0 0 0,大于设置为255 255 255
 def self.binarization(bmp)
  imageGreyLevel = bmp.getGreyLevel
  for i in 0 .. bmp.height - 1
   for j in 0 .. bmp.width - 1
    rgb = bmp.getRGB(i, j)
    if rgb.getGreyLevel<imageGreyLevel
     bmp.setRGB(i, j, RGB.new(0, 0, 0))
    else
     bmp.setRGB(i, j, RGB.new(255, 255, 255))
    end
   end

  end
 end

Effet de binarisation


3. Film négatif

La réalisation de l'effet de film négatif est très simple, c'est-à-dire en inversant la valeur de chaque canal RVB . Utilisez simplement 255 pour soustraire

#底片化图片
 #RGB取反色255-
 def self.contraryColor(bmp)
  for i in 0 .. bmp.height - 1
   for j in 0 .. bmp.width - 1
    rgb = bmp.getRGB(i, j)
    bmp.setRGB(i, j, rgb.getContrary)
   end
  end
 end

effet négatif


4. Soulagement. effet

L'algorithme de relief est relativement compliqué. Soustrayez la valeur RVB du point adjacent de la valeur RVB du point actuel et ajoutez 128 comme nouvelle valeur RVB. Étant donné que les valeurs de couleur des points adjacents dans l'image sont relativement proches, après un tel traitement par algorithme, seules les zones de bord de la couleur, c'est-à-dire les résultats des parties présentant de grandes différences de couleur adjacentes, seront plus évidentes, tandis que d'autres zones lisses les zones n'auront pas les mêmes valeurs de couleur. Elles sont toutes proches d'environ 128, ce qui est du gris, ce qui fait que
a un effet de relief.

Dans l'effet réel, après ce traitement, certaines zones peuvent encore avoir des points ou des bandes de « couleur », il est donc préférable d'effectuer un traitement en niveaux de gris sur les nouvelles valeurs RVB.

#浮雕效果
 #浮雕的算法相对复杂一些,用当前点的RGB值减去相邻点的RGB值并加上128作为新的RGB值。由于图片中相邻点的颜色值是比较接近的,
 #因此这样的算法 处理之后,只有颜色的边沿区域,也就是相邻颜色差异较大的部分的结果才会比较明显,而其他平滑区域则值都接近128左右,
 #也就是灰色,这样就具有了浮雕效果。
 #在实际的效果中,这样处理后,有些区域可能还是会有”彩色”的一些点或者条状痕迹,所以最好再对新的RGB值做一个灰度处理。
 def self.emboss(bmp)

  preRGB=RGB.new(128, 128, 128)

  for i in 0 .. bmp.height - 1
   for j in 0 .. bmp.width - 1
    currentRGB=bmp.getRGB(i, j)
    r=(currentRGB.r-preRGB.r)*1+128
    g=(currentRGB.g - preRGB.g)*1+128
    b=(currentRGB.b-preRGB.b)*1+128

    bmp.setRGB(i, j, RGB.new(r,g,b).getGreyRGB)
    preRGB = currentRGB
   end
  end

 end

Effet de relief


Le contenu ci-dessus concerne le filtre d'image implémenté dans le code de l'algorithme Ruby Mirror, j'espère que cela aidera tout le monde.

Recommandations associées :

Parlez d'une introduction détaillée aux filtres CSS

Exemples détaillés d'effets de filtre CSS3

Exemple de partage de code HTML5 pour implémenter un effet de filtre d'image

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn