Encuentre la imagen en escala de grises C# de la imagen más similar mediante un algoritmo de similitud
Esta búsqueda de imágenes se puede realizar utilizando un algoritmo de hash perceptivo.
Paso 1 Reducir el tamaño de la imagen
Reducir el tamaño de la imagen a 8x8, total **** 64 píxeles . El propósito de este paso es eliminar las diferencias entre varios tamaños de imagen y proporciones de imagen, conservando solo información básica como estructura, luz y oscuridad, etc.
Paso 2 Convertir a escala de grises
Convierte la imagen reducida a 64 niveles de escala de grises.
Paso 3 Calcular el valor de gris promedio
Calcular el valor de gris promedio de todos los píxeles de la imagen
Paso 4 Comparar los valores de gris de los píxeles
Compare el valor de gris de cada píxel con el valor promedio. Si es mayor o igual al valor promedio, se registra como 1. Si es menor que el valor promedio, se registra como 0.
Paso 5 Calcula el valor hash
Fusiona los resultados de la comparación del paso anterior.
Combina los resultados del paso anterior para formar un entero binario de 64 bits, que es la huella digital de la imagen.
Paso 6 Compara las huellas digitales de las imágenes
Una vez que tengas las huellas digitales de las imágenes, puedes comparar las huellas digitales de diferentes imágenes para descubrir cuántos de los 64 bits son diferentes. Si el número de bits diferentes es menor que 5, las dos imágenes son similares; si hay más de 10, las dos imágenes son diferentes.
El código C# exacto se puede encontrar en:using?System;
using?System.IO;
using?System.Drawing
espacio de nombres?FotoSimilar
{
clase?FotoSimilar
{
Imagen?SourceImg; public?SimilarPhoto(string?filePath)
{
SourceImg?=?Image.FromFile(filePath);
}
public ?SimilarPhoto(Stream?stream)
{
SourceImg?=?Image.FromStream(stream);
}
público? String?GetHash()
{
Imagen?image?=?ReduceSize();
Byte[]?grayValues?=?ReduceColor(imagen) ;
Byte?average?=?CalcAverage(grayValues);
String?reslut?=?ComputeBits(grayValues,?average);
return?reslut ;
}
//?Paso?Reducir el tamaño a 8*8
¿Imagen privada?ReduceSize(int?width?=?8,? int? height?=?8)
{
Imagen?image?=?SourceImg.GetThumbnailImage(width,?height,? ()? =>?{=>?} ,? IntPtr.Zero);
return?image;
}
//?Paso?2 Reducir color
¿Byte[ privado? ]?ReduceColor(Imagen?imagen)
{
Bitmap?bitMap?=?new?Bitmap(imagen);
Byte[]?grayValues ?= ?new?Byte[image.Width?*?image.Height];
for(int?x?=? 0;?x for(int?y?=?(byte)((color.R?*?30?+?color.G?*?59?+?color.B?*?11)?/?100); grayValues[x?*?image.Width?+?y]=?grayValue; } return?grayValues; } /?Promediar los colores private?Byte?CalcAverage(byte []?values) { int?sum ?= ?0; for?(int?i?=?0;?i? suma?+=?(int) valores[ i]; return?Convert.ToByte(sum?/?values.Length); } /?Step ?4?String?ComputeBits(byte[]?values,?byte?averageValue) { char[]?result?=?new?char[values.Length]; for?(int?i?=?0;? i? { if?(values[ i]? resultado[i]?' 0'; else resultado[i] =?' ; } return?hash public?static?Int32?CalcSimilarDegree(string?a,string?b) { si?(a.Longitud!=?b.Longitud) throw?new?ArgumentException(); int?count?=?0; for(int?i?=?0;?i? { si?(a[i ]?=?b[i]) cuenta++; } retorno?cuenta; } } } } }