Google 검색 결과에 (내 질문에) 답변하려면 this을 찾았습니다. 기본 아이디어는 오프셋/회전, 지배적 인 색 검색 등으로 이미지를 테스트하는 것입니다. 지금까지 이것이 내가 찾을 수있는 최상의 정보이므로, 한번 시도해 보도록하겠습니다.
이 코드는 다음과가 보이는 제안 : "픽셀의 어떤 부분이 두 이미지에서 동일"
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
namespace BitmapSimilarity
{
public interface IBitmapCompare
{
double GetSimilarity(Bitmap a, Bitmap b);
}
class BitmapCompare: IBitmapCompare
{
public struct RGBdata
{
public int r;
public int g;
public int b;
public int GetLargest()
{
if(r>b)
{
if(r>g)
{
return 1;
}
else
{
return 2;
}
}
else
{
return 3;
}
}
}
private RGBdata ProcessBitmap(Bitmap a)
{
BitmapData bmpData = a.LockBits(new Rectangle(0,0,a.Width,a.Height),ImageLockMode.ReadOnly,PixelFormat.Format24bppRgb);
IntPtr ptr = bmpData.Scan0;
RGBdata data = new RGBdata();
unsafe
{
byte* p = (byte*)(void*)ptr;
int offset = bmpData.Stride - a.Width * 3;
int width = a.Width * 3;
for (int y = 0; y < a.Height; ++y)
{
for (int x = 0; x < width; ++x)
{
data.r += p[0]; //gets red values
data.g += p[1]; //gets green values
data.b += p[2]; //gets blue values
++p;
}
p += offset;
}
}
a.UnlockBits(bmpData);
return data;
}
public double GetSimilarity(Bitmap a, Bitmap b)
{
RGBdata dataA = ProcessBitmap(a);
RGBdata dataB = ProcessBitmap(b);
double result = 0;
int averageA = 0;
int averageB = 0;
int maxA = 0;
int maxB = 0;
maxA = ((a.Width * 3) * a.Height);
maxB = ((b.Width * 3) * b.Height);
switch (dataA.GetLargest()) //Find dominant color to compare
{
case 1:
{
averageA = Math.Abs(dataA.r/maxA);
averageB = Math.Abs(dataB.r/maxB);
result = (averageA - averageB)/2;
break;
}
case 2:
{
averageA = Math.Abs(dataA.g/maxA);
averageB = Math.Abs(dataB.g/maxB);
result = (averageA - averageB)/2;
break;
}
case 3:
{
averageA = Math.Abs(dataA.b/maxA);
averageB = Math.Abs(dataB.b/maxB);
result = (averageA - averageB)/2;
break;
}
}
result = Math.Abs((result + 100)/100);
if (result > 1.0)
{
result -= 1.0;
}
return result;
}
}
class Program
{
static BitmapCompare SimpleCompare;
static Bitmap searchImage;
static private void Line()
{
for (int x = 0; x < Console.BufferWidth; x++)
{
Console.Write("*");
}
}
static void CheckDirectory(string directory,double percentage,Bitmap sImage)
{
DirectoryInfo dir = new DirectoryInfo(directory);
FileInfo[] files = null;
try
{
files = dir.GetFiles("*.jpg");
}
catch (DirectoryNotFoundException)
{
Console.WriteLine("Bad directory specified");
return;
}
double sim = 0;
foreach (FileInfo f in files)
{
sim = Math.Round(SimpleCompare.GetSimilarity(sImage, new Bitmap(f.FullName)),3);
if (sim >= percentage)
{
Console.WriteLine(f.Name);
Console.WriteLine("Match of: {0}", sim);
Line();
}
}
}
static void Main(string[] args)
{
SimpleCompare = new BitmapCompare();
Console.Write("Enter path to search image: ");
try
{
searchImage = new Bitmap(Console.ReadLine());
}
catch (ArgumentException)
{
Console.WriteLine("Bad file");
return;
}
Console.Write("Enter directory to scan: ");
string dir = Console.ReadLine();
Line();
CheckDirectory(dir, 0.95 , searchImage); //Display only images that match by 95%
}
}
}
방금 찾고 있습니다 또는 하나의 이미지가 다른 이미지와 관련되어 움직여도 유사성을 인식 할 수있는 더 정교한 것을 원하십니까? 그들은 어떤 종류의 이미지입니까? –
나는 유사성을 인식 할 수있는보다 정교한 것을 필요로한다. 이미지는 추상적 인 색상 패턴입니다. 감사. –
어떤 해결책이 귀하의 이미지가 어떤 것인지, "유사한"것으로 간주되는 것의 세부 사항에 특정적일 것입니다 ... 아마도 몇 가지 예제 이미지를 게시 할 수 있습니까? –