C#/Winform

C# Winform 이미지 히스토그램 구현

우준세 2023. 11. 29. 15:02
728x90
반응형

 

 

이번 포스팅은 C# Winform에서 이미지의 히스토그램을 표현하는 방법에 대해 알아보겠습니다.

히스토그램은 이미지의 색상 분포를 시각화하는데 유용하게 사용됩니다.

이를 통해 이미지의 전반적인 색상 톤을 빠르게 이해할 수 있습니다. 


| UI 구현

먼저 히스토그램으로 표현할 이미지를 나타낼 picturebox 도구와 

이미지의 히스토그램을 나타낼 chart 도구를 Form에 추가합니다.

 

 

버튼 두 개를 통해 이미지를 불러오고 불러온 이미지의 히스토그램을 Chart에 표시해 보겠습니다. 


| picturebox 이미지 로드 구현

Image Load 버튼을 클릭 시 설정한 경로의 이미지를 picturebox에 띄우는 코드를 구현하겠습니다.

 

예시) Image Load 클릭 이벤트에 picturebox Image Load 구현 

public Bitmap bmp = null;

private void btnImageLoad_Click(object sender, EventArgs e)
{
    try
    {
        picboxHistogram.Image = Image.FromFile("이미지 경로");
        bmp = new Bitmap(picboxHistogram.Image);
    }
    catch (Exception)
    {
        throw;
    }

}

 

 

결과) Image Load 버튼 클릭 시 경로 이미지 로드 확인

 


| Histogram Chart 시각화 

먼저 불러온 이미지를 Histogram으로 구현 후 Chart에 표현하는 것을 구현하겠습니다.

 

예시) 이미지의 색상 값 분포를 확인하는 코드 구현 

public int[][] GetHist(Bitmap bmp)
{
    int[] Red = new int[256];
    int[] Green = new int[256];
    int[] Blue = new int[256];

    for (int i = 0; i < bmp.Width; i++)
    {
        for (int j = 0; j < bmp.Height; j++)
        {
            Color pixelColor = bmp.GetPixel(i, j);
            Red[pixelColor.R]++;
            Green[pixelColor.G]++;
            Blue[pixelColor.B]++;
        }
    }

    return new int[][] { Red, Green, Blue};
}

 

윜 코드는 이미지의 각 픽셀에 접근하여 색상 값들의 분포를 계산한 코드입니다.

Bimap 객체를 인자로 받아 RGB 색상의 히스토그램 데이터를 2차원 배열로 반환합니다. 

 

예시) Chart에 히스토그램을 그리는 코드 구현 

private void btnDrawHistogram_Click(object sender, EventArgs e)
{
    chartHistogram.Series.Clear();

    string[] seriesNames = { "Red", "Green", "Blue" };
    Color[] seriesColors = { Color.Red, Color.Green, Color.Blue };
    var hist = GetHist(bmp);

    for (int index = 0; index < hist.Length; index++)
    {
        chartHistogram.Series.Add(seriesNames[index]);
        chartHistogram.Series[seriesNames[index]].ChartType = SeriesChartType.Line;
        chartHistogram.Series[seriesNames[index]].Color = seriesColors[index];
        for (int i = 0; i < 256; i++)
        {
            chartHistogram.Series[seriesNames[index]].Points.AddXY(i, hist[index][i]);
        }
    }
}

 

위 코드는 Draw Histogram 버튼 클릭 시 Chart에 로드한 이미지의 히스토그램의 분포를 그리는 코드입니다.

SeriesChartType.Line을 사용하여 선 그래프 형태의 히스토그램을 그렸고

chart.Series.Color를 사용하여 각 Series에 대한 색상을 설정하였습니다. 

이렇게 하면 Chart의 각 범례가 각각의 색상을 가지게 되며 차트를 보다 쉽게 이해할 수 있습니다.

 

결과)


| 마무리

C# Winform으로 이미지의 히스토그램 시각화를 해보았습니다.

위 코드 예시들은 간단한 에시이므로 실제 프로젝트에 적용할 때는

성능 향상, Ui 스레드 분리, 예외 처리 등을 고려해야 합니다.

 

틀린 부분이나 질문이 있으시면 댓글로 남겨주세요

 

감사합니다. :) 

 

 

 

728x90
반응형