2009-10-19 3 views
1

C#에서 검정/어두운 이미지를 식별하는 방법. 이미지 가시성 또는 어둠 비율을 확인할 수있는 API가 있습니까? 내 응용 프로그램에서 이미지를 복사하는 동안 각 이미지를 확인하고 검은 이미지를 삭제하고 싶습니다.C#에서 검은 색 또는 어두운 이미지를 식별하는 방법은 무엇입니까?

모든 아이디어 어떻게 이것을 달성 할 수 있습니까?

+0

. 모든 단일 C# 질문에 net 태그. 그것은 사이트에 가치를 추가하지 않습니다. – Servy

답변

5

이미지 어둠을 얻을 수있는 아이디어/밝기가 될 수 있습니다

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에 의해

+5

Bitmap.GetPixel이 너무 느립니다. BitMap.LockBits 및 안전하지 않은 코드를 사용하는 DreamWalker의 솔루션은 먼 길을 능가 할 것입니다 ... – ParmesanCodice

+0

ParmesanCodice가 언급했듯이 이제 약간 큰 이미지 (640x480)를 필터링 중이며 어두운 이미지 필터로 인해 느려집니다. – zHs

0

시작 했죠을 가진 사람으로 어두운 이미지를 고려 이미지의 모든 픽셀을 반복하고 각 픽셀의 HSV 색상을 계산 한 다음 'V'구성 요소 (색상의 '밝기'를 나타냄)의 평균을 계산합니다.

7
// 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

+1, 일부 사용자는 밝기 선에서 수학에 대해 설명 할 수 있습니다. – user7116

3

이미지 처리 지원을 포함하는 프레임 워크를 사용할 수 있습니다. 예를 들어 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 
} 
0

감사 엘리사는,이 방법으로 그 일을하고있다 : 당신은 추가 주위에 갈 필요가 없습니다 @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); 
+1

euhm, 마지막 줄이 잘못 되었나요? bitmap.Size.Width * bitmap.Size.Height이어야합니다. – Stormenet

+0

예, 잘못되었습니다! 나는 이것을 깨닫지 못했다. 그 이유는 내가 왜 평균이 너무 큰지 생각하고 있었기 때문입니다. 수정 해줘서 고마워. :) – zHs

관련 문제