Red de conocimiento informático - Computadora portátil - Encuentre la imagen en escala de grises C# de la imagen más similar mediante un algoritmo de similitud

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;

}

}

}

}

}