C#에서 검정/어두운 이미지를 식별하는 방법. 이미지 가시성 또는 어둠 비율을 확인할 수있는 API가 있습니까? 내 응용 프로그램에서 이미지를 복사하는 동안 각 이미지를 확인하고 검은 이미지를 삭제하고 싶습니다.C#에서 검은 색 또는 어두운 이미지를 식별하는 방법은 무엇입니까?
모든 아이디어 어떻게 이것을 달성 할 수 있습니까?
C#에서 검정/어두운 이미지를 식별하는 방법. 이미지 가시성 또는 어둠 비율을 확인할 수있는 API가 있습니까? 내 응용 프로그램에서 이미지를 복사하는 동안 각 이미지를 확인하고 검은 이미지를 삭제하고 싶습니다.C#에서 검은 색 또는 어두운 이미지를 식별하는 방법은 무엇입니까?
모든 아이디어 어떻게 이것을 달성 할 수 있습니까?
이미지 어둠을 얻을 수있는 아이디어/밝기가 될 수 있습니다
Bitmap bitmap = // the bitmap
var colors = new List<Color>();
for (int x = 0; x < bitmap.Size.Width; x++)
{
for (int y = 0; y < bitmap.Size.Height; y++)
{
colors.Add(bitmap.GetPixel(x, y));
}
}
float imageBrightness = colors.Average(color => color.GetBrightness());
어쩌면 0.1 이하의 밝기 (또는 관련 다른 값) I에 의해
Bitmap.GetPixel이 너무 느립니다. BitMap.LockBits 및 안전하지 않은 코드를 사용하는 DreamWalker의 솔루션은 먼 길을 능가 할 것입니다 ... – ParmesanCodice
ParmesanCodice가 언급했듯이 이제 약간 큰 이미지 (640x480)를 필터링 중이며 어두운 이미지 필터로 인해 느려집니다. – zHs
시작 했죠을 가진 사람으로 어두운 이미지를 고려 이미지의 모든 픽셀을 반복하고 각 픽셀의 HSV 색상을 계산 한 다음 'V'구성 요소 (색상의 '밝기'를 나타냄)의 평균을 계산합니다.
// For fast access to pixels
public static unsafe byte[] BitmapToByteArray(Bitmap bitmap) {
BitmapData bmd = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly,
PixelFormat.Format32bppArgb);
byte[] bytes = new byte[bmd.Height * bmd.Stride];
byte* pnt = (byte*) bmd.Scan0;
Marshal.Copy((IntPtr) pnt, bytes, 0, bmd.Height * bmd.Stride);
bitmap.UnlockBits(bmd);
return bytes;
}
public bool IsDark(Bitmap bitmap, byte tolerance, double darkProcent) {
byte[] bytes = BitmapToByteArray(bitmap);
int count = 0, all = bitmap.Width * bitmap.Height;
for (int i = 0; i < bytes.Length; i += 4) {
byte r = bytes[i + 2], g = bytes[i + 1], b = bytes[i];
byte brightness = (byte) Math.Round((0.299 * r + 0.5876 * g + 0.114 * b));
if (brightness <= tolerance)
count++;
}
return (1d * count/all) <= darkProcent;
}
public void Run(Bitmap bitmap) { // Example of use
// some code
bool dark = IsDark(bitmap, 40, 0.9);
// some code
}
+1, 일부 사용자는 밝기 선에서 수학에 대해 설명 할 수 있습니다. – user7116
이미지 처리 지원을 포함하는 프레임 워크를 사용할 수 있습니다. 예를 들어 ImageStatisticsHSL
Class을 참조하십시오. 적절한 Saturation
값을 선택하거나 Luminance
막대 그래프를 사용하십시오.
이 클래스는 각 HSL 색상 채널에 대한 막대 그래프, 평균, 표준 편차 등과 같은 이미지에 대한 통계 값을 누적하는 데 사용됩니다.
클래스는 24 및 32 bpp 컬러 이미지를 처리 할 수 있습니다.
샘플 사용 C 번호 : 아이디어에 대한
// gather statistics
ImageStatisticsHSL stat = new ImageStatisticsHSL(image);
// get saturation channel's histogram
ContinuousHistogram saturation = stat.Saturation;
// check mean value of saturation channel
if (saturation.Mean > 0.5)
{
// do further processing
}
감사 엘리사는,이 방법으로 그 일을하고있다 : 당신은 추가 주위에 갈 필요가 없습니다 @dreamwalker
Bitmap bitmap = new Bitmap("123712.jpg");
float brightness = 0;
for (int x = 0; x < bitmap.Size.Width; x++)
{
for (int y = 0; y < bitmap.Size.Height; y++)
{
brightness += bitmap.GetPixel(x, y).GetBrightness();
}
}
float average = brightness/(bitmap.Size.Width * bitmap.Size.Height);
. 모든 단일 C# 질문에 net 태그. 그것은 사이트에 가치를 추가하지 않습니다. – Servy