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.GetRotationMatrix2D와 Cv2.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. 결론
- HConcat과 VConcat을 사용하여 이미지를 수평 또는 수직으로 쉽게 합칠 수 있습니다.
- GetRotationMatrix2D와 WarpAffine을 활용하여 이미지를 회전할 수 있으며, 손실 방지를 위한 보정도 가능합니다.
- OpenCvSharp은 다양한 이미지 처리 기능을 제공하며, 이를 통해 C#에서도 강력한 컴퓨터 비전 기능을 활용할 수 있습니다.
이 글이 OpenCvSharp을 활용한 이미지 처리에 도움이 되길 바랍니다! 😊