본문 바로가기
카테고리 없음

C# OpenCvSharp 이미지 합치기,회전(rotate), 잘림 방지 방법

by tasiklee 2025. 2. 28.

1. 이미지 합치기, 회전 및 잘림 방지 방법

이미지 처리는 다양한 응용 분야에서 중요한 역할을 합니다. 특히 여러 장의 이미지를 하나로 합치거나, 회전 시 이미지 손실(잘림)을 방지하는 것은 컴퓨터 비전에서 자주 필요한 작업입니다. C#의 OpenCvSharp 라이브러리를 활용하면 이러한 작업을 효과적으로 수행할 수 있습니다. 본 글에서는 OpenCvSharp을 사용하여 이미지를 수평/수직으로 합치고, 회전하면서 손실을 최소화하는 방법을 설명합니다.

2. 이미지 수평/수직 합치기

여러 개의 이미지를 하나로 합치는 방법을 소개합니다.

2.1 수평으로 이미지 합치기

using OpenCvSharp;

class Program
{
    static void Main()
    {
        Mat img1 = Cv2.ImRead("image1.jpg");
        Mat img2 = Cv2.ImRead("image2.jpg");
        
        Mat result = new Mat();
        Cv2.HConcat(new Mat[] { img1, img2 }, result);
        
        Cv2.ImWrite("horizontal_result.jpg", result);
    }
}

Cv2.HConcat을 사용하여 이미지를 수평으로 합칠 수 있습니다.

2.2 수직으로 이미지 합치기

using OpenCvSharp;

class Program
{
    static void Main()
    {
        Mat img1 = Cv2.ImRead("image1.jpg");
        Mat img2 = Cv2.ImRead("image2.jpg");
        
        Mat result = new Mat();
        Cv2.VConcat(new Mat[] { img1, img2 }, result);
        
        Cv2.ImWrite("vertical_result.jpg", result);
    }
}

Cv2.VConcat을 사용하여 이미지를 수직으로 합칠 수 있습니다.

3. 이미지 회전 및 손실 방지

이미지를 회전할 때 원래의 크기를 유지하면서 손실을 최소화하는 방법을 소개합니다.

3.1 이미지 중앙을 기준으로 회전하기

using OpenCvSharp;

class Program
{
    static void Main()
    {
        Mat img = Cv2.ImRead("image.jpg");
        Point2f center = new Point2f(img.Cols / 2, img.Rows / 2);
        
        Mat rotationMatrix = Cv2.GetRotationMatrix2D(center, 45, 1.0);
        Mat rotatedImage = new Mat();
        Cv2.WarpAffine(img, rotatedImage, rotationMatrix, img.Size());
        
        Cv2.ImWrite("rotated_image.jpg", rotatedImage);
    }
}

Cv2.GetRotationMatrix2DCv2.WarpAffine을 사용하여 중앙을 기준으로 이미지를 회전할 수 있습니다.

3.2 이미지 손실을 방지하면서 회전하기

기본적인 WarpAffine 변환은 원본 이미지 크기를 유지하지만, 회전 시 이미지 일부가 잘릴 수 있습니다. 이를 방지하려면 다음과 같은 방법을 사용합니다.

using OpenCvSharp;

class Program
{
    static void Main()
    {
        Mat img = Cv2.ImRead("image.jpg");
        double angle = 45;
        
        double radians = angle * (Math.PI / 180);
        int newWidth = (int)(img.Width * Math.Abs(Math.Cos(radians)) + img.Height * Math.Abs(Math.Sin(radians)));
        int newHeight = (int)(img.Width * Math.Abs(Math.Sin(radians)) + img.Height * Math.Abs(Math.Cos(radians)));
        
        Mat rotationMatrix = Cv2.GetRotationMatrix2D(new Point2f(img.Cols / 2, img.Rows / 2), angle, 1.0);
        rotationMatrix.Set<double>(0, 2, rotationMatrix.At<double>(0, 2) + (newWidth - img.Width) / 2);
        rotationMatrix.Set<double>(1, 2, rotationMatrix.At<double>(1, 2) + (newHeight - img.Height) / 2);
        
        Mat rotatedImage = new Mat();
        Cv2.WarpAffine(img, rotatedImage, rotationMatrix, new Size(newWidth, newHeight));
        
        Cv2.ImWrite("rotated_no_loss.jpg", rotatedImage);
    }
}

이 방법은 회전 후의 새로운 이미지 크기를 계산하여 손실 없이 보존할 수 있도록 합니다.

4. 결론

  • HConcatVConcat을 사용하여 이미지를 수평 또는 수직으로 쉽게 합칠 수 있습니다.
  • GetRotationMatrix2DWarpAffine을 활용하여 이미지를 회전할 수 있으며, 손실 방지를 위한 보정도 가능합니다.
  • OpenCvSharp은 다양한 이미지 처리 기능을 제공하며, 이를 통해 C#에서도 강력한 컴퓨터 비전 기능을 활용할 수 있습니다.

이 글이 OpenCvSharp을 활용한 이미지 처리에 도움이 되길 바랍니다! 😊