본문 바로가기
프로그래밍 언어/C#

[C#] 이미지 투명화(배경제거) - #1

by Jinwood 2021. 4. 13.
반응형

이미지를 투명화 하기 위해서 가장 먼저 어떤 색상을 투명하게 만들 것인지 설정해야 한다. OpenCV를 사용하지 않고 이미지를 편집하기 위해서는 이미지를 Bitmap으로 생성하고, 생성된 Bitmap을 이용하여 특정 동작(이미지 미러/회전/픽셀의 색상 변경 등)을 수행한다.

 

어떤 색상을 투명하게 만들것인지 설정했다면 MakeTransparent(Color) 메서드를 사용하면 해당 색상이 모두 투명하게 변한다. 아래에 예를 위해 준비한 그림은 바탕화면에 저장해둔 Rhino.PNG라는 이미지 파일이다. 이 파일의 검은색 부분은 R, G, B 값이 (0,0,0)이다. 이 색을 투명화하기 위한 코드는 그림 아래에 작성하였다. Alpha 값을 따로 설정 가능하지만, 아래 코드에는 Alpha값을 적용하지 않은 간단한 코드만 작성하였다.

 

이미지 배경 제거 결과

 

1
2
3
4
5
6
7
8
9
10
11
12
try
{
    Bitmap bmp = new Bitmap(@"C:\Users\admin\Desktop\Rhino.PNG");     // 비트맵 생성
    Color targetColor = Color.FromArgb(000);                      // 변경할 색상 설정
   bmp.MakeTransparent(targetColor);                                 // 투명화 진행
    bmp.Save(@"C:\Users\admin\Desktop\Rhino_Transparent.PNG");        // 비트맵 저장
   bmp.Dispose();                                                    // 리소스 
}
catch(Exception err)
{
    MessageBox.Show(err.ToString(), "Sample");
}
cs

 

언뜻 보기엔 배경 제거가 완벽하게 된 것처럼 보일 수 있다. 하지만 실제로 파일을 열어보면 아래 그림과 같이 기존의 흰색 윤곽 주위에 검정색 선들이 지저분하게 남아있다. 이유는 검은색으로 보이는 픽셀의 색의 R, G, B 값이 (0,0,0)이 아니기 때문이다. 만약 이미지 윤곽 부분의 R, G, B 값이 정확하게 (0,0,0)이었다면 이미는 흰 부분만 존재했을 것이다.

 

이 문제를 해결하기 위해서 찾아본 방법중 하나는 Threshold를 설정하고, 해당 컬러 이내의 색을 모두 투명화 하는 방법이다. 각각의 R, G, B 값의 편차가 Threshold 이내라면 해당 색을 모두 변경하는 것이다. 이 방법은 두가지로 생각될 수 있다.

 

  1. 편차 내의 R,G,B 값의 리스트를 만들어두고 해당 색을 모두 MakeTransparent(Color)를 통해 투명화한다.
  2. 비트맵 각 픽셀의 R,G,B 값을 받은 뒤 지정한 색상과의 편차 값을 계산하여 편차 이내라면 투명화한다.

1번의 경우 설정한 편차에 따라 RGB 리스트를 만들어야하고 R, G, B 3가지 값이기 때문에 편차 값에 따른 리스트의 양이 많아지지만, MakeTransparent(Color) 메서드를 사용하여 픽셀에 대하여 각각 투명화를 적용할 필요가 없다.

 

2번의 경우 비트맵 각 픽셀의 R,G,B 값을 받아야 하고 MakerTransparent(Color) 메서드를 사용할 수 없지만 편차를 계산하기가 보다 수월하다. 

 

참고로 편차는 구글링해본 결과 두 점 간의 거리를 구하는 것과 같이 R, G, B값의 차를 제곱한 값을 모두 더한 뒤에 제곱근을 구하는 것이다.

 

2번 방법을 이용해서 상위에 설명된 코드의 실행 결과보다 나은 결과를 얻는 방법은 2편에서 설명하도록 하겠다.

 

https://hvyair.tistory.com/46

 

[C#] 이미지 투명화(배경제거) - #2

1편에서는 이미지를 Bitmap으로 변환한 뒤 MakeTransparent(Color) 메서드를 이용해서 배경을 제거하는, Transparent로 변경하는 방법을 설명하였다. 2021.04.13 - [프로그래밍 언어/C#] - [C#] 이미지 투명화(배..

hvyair.tistory.com

 

반응형

댓글