2016-08-12 2 views
0

이미지를 자동 레벨하려고합니다. 내 코드는 다음과 같습니다.AutoLevel (Channels.RGB)이 효과가없는 것으로 보입니다.

MagickImage image = new MagickImage(stream); 
image.AutoLevel(Channels.RGB); 

나중에 코드를 웹 응답으로 보내 드리겠습니다. 어떤 이유로이 코드는 이미지에 아무런 영향을 미치지 않습니다. 원본과 완전히 똑같아 보입니다. 다음으로 변경하는 경우 :

MagickImage image = new MagickImage(stream); 
image.Posterize(2); 

그러면 필터가 적용된 것을 확인할 수 있습니다.

AutoLevel에는 무엇이 누락 되었습니까?

업데이트 : 코드 시도

:

var image1 = Image.Clone(); 
Image.AutoLevel(Channels.RGB); 
var diff = Image.Compare(image1, ErrorMetric.RootMeanSquared); 

와 DIFF의 값이 0.0 인 상태에서이 코드 (그리고 사용하여 동일한 이미지)와 :

var image1 = Image.Clone(); 
Image.Equalize(); 
var diff = Image.Compare(image1, ErrorMetric.RootMeanSquared); 

diff의 값은 0.315입니다.

+0

명확히하기 위해 사용하는 사진에 관계없이 diff 값은 0.0입니다. – Juvaly

답변

0

효과 AutoLevel은 입력 이미지에 따라 눈에 띄지 않을 수 있습니다. 다음 코드를 사용하여 빠른 테스트를 수행했습니다.

using (MagickImage imageA = new MagickImage("logo:")) 
{ 
    imageA.Write(@"c:\imageA.jpg") 

    imageA.AutoLevel(Channels.Default); 

    using (MagickImage imageB = new MagickImage("logo:")) 
    { 
    double difference = imageA.Compare(imageB, ErrorMetric.RootMeanSquared); 
    Assert.AreNotEqual(0.0, difference); 

    imageB.Write(@"c:\imageB.jpg") 
    } 
} 

이 테스트는 통과되었지만 차이 값은 매우 작습니다. 즉, 이미지를 눈과 비교할 때 큰 차이를 찾지 못할 수도 있습니다.

다음은 다른 입력 이미지를 사용할 때 AutoLevel 메서드가 무언가를한다는 것을 보여주는 예제입니다.

using (MagickImage imageA = new MagickImage("gradient:gray70-gray30", 150, 100)) 
{ 
    imageA.Write(@"c:\imageA.jpg") 

    imageA.AutoLevel(Channels.Default); 

    using (MagickImage imageB = new MagickImage("gradient:gray70-gray30", 150, 100)) 
    { 
    double difference = imageA.Compare(imageB, ErrorMetric.RootMeanSquared); 
    Assert.AreNotEqual(0.0, difference); 

    imageB.Write(@"c:\imageB.jpg") 
    } 
} 
관련 문제