이번 포스팅은 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 스레드 분리, 예외 처리 등을 고려해야 합니다.
틀린 부분이나 질문이 있으시면 댓글로 남겨주세요
감사합니다. :)
'C# > Winform' 카테고리의 다른 글
C# Winform DataGridView Header Cell 높이 변경 (0) | 2023.12.20 |
---|---|
C# Winform DataGridView Column 높이 변경 (0) | 2023.12.19 |
C# Winform DataGridView 이해 (0) | 2023.12.19 |
[C# Winform] PropertyGrid 데이터를 INI 파일로 저장하기 (0) | 2021.12.13 |
[C# Winform] Form에 Form 붙이기 (0) | 2021.12.07 |