Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바 OpenCV copyMakeBorder()로 이미지에 테두리 추가하는 방법

이미지에 테두리(Border) 추가하기

이미지 처리에서 테두리는 이미지 가장자리를 강조하거나, 필터 및 컨볼루션 연산 시 발생할 수 있는 경계 픽셀 문제를 보완하기 위해 자주 활용됩니다. 자바(Java) OpenCV에서는 Core.copyMakeBorder() 메서드 하나만으로 원본 이미지의 상하좌우에 다양한 형태의 테두리를 손쉽게 추가할 수 있습니다.

copyMakeBorder() 메서드의 매개변수

  • src – 테두리를 추가할 원본(소스) 이미지를 나타내는 Mat 객체

  • dst – 결과(출력) 이미지를 저장할 Mat 객체

  • top, bottom, left, right – 이미지의 위, 아래, 왼쪽, 오른쪽 네 방향 각각의 테두리 두께(픽셀 단위 정수)

  • borderType – 적용할 테두리 유형을 지정하는 정수 값

주요 테두리 유형

  • Core.BORDER_CONSTANT – 지정한 고정 색상으로 테두리를 채웁니다.

  • Core.BORDER_REPLICATE – 가장자리 픽셀 값을 그대로 복제하여 채웁니다.

  • Core.BORDER_REFLECT – 가장자리를 기준으로 픽셀을 거울처럼 반사하여 채웁니다.

  • Core.BORDER_WRAP – 반대편 가장자리의 픽셀을 이어 붙여 채웁니다.

예제 코드

다음 예제는 이미지를 불러온 뒤 네 방향 모두 20픽셀 크기의 고정 색상(BORDER_CONSTANT) 테두리를 추가하고, 그 결과를 JavaFX 윈도우에 출력합니다.

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;

public class AddingBorders extends Application {
   public void start(Stage stage) throws IOException {
      // OpenCV 핵심(core) 라이브러리 로드
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
      String file ="D:\\Images\\cat.jpg";
      Mat src = Imgcodecs.imread(file);
      // 출력 이미지를 저장할 빈 Mat 객체 생성
      Mat dst = new Mat(src.rows(), src.cols(), src.type());
      // 테두리 추가 (네 방향 모두 20픽셀, 고정 색상 테두리)
      Core.copyMakeBorder(src, dst, 20, 20, 20, 20, Core.BORDER_CONSTANT);
      // Mat 객체를 JavaFX WritableImage로 변환
      Image img = HighGui.toBufferedImage(dst);
      WritableImage writableImage = SwingFXUtils.toFXImage((BufferedImage) img, null);
      // ImageView 설정
      ImageView imageView = new ImageView(writableImage);
      imageView.setX(10);
      imageView.setY(10);
      imageView.setFitWidth(575);
      imageView.setPreserveRatio(true);
      // Scene 객체 설정
      Group root = new Group(imageView);
      Scene scene = new Scene(root, 595, 400);
      stage.setTitle("Adding Borders");
      stage.setScene(scene);
      stage.show();
  }
  public static void main(String args[]) {
     launch(args);
  }
}

핵심 흐름은 다음과 같습니다. 먼저 Imgcodecs.imread()로 이미지 파일을 읽어 Mat 객체에 담고, Core.copyMakeBorder()를 한 번 호출하여 테두리가 포함된 새 이미지를 생성합니다. 이후 HighGui.toBufferedImage()SwingFXUtils.toFXImage()를 사용해 Mat 데이터를 JavaFX에서 화면에 표시할 수 있는 이미지 형식으로 변환한 뒤, ImageView를 통해 윈도우에 출력합니다.

입력 이미지

자바 OpenCV copyMakeBorder()로 이미지에 테두리 추가하는 방법

실행 결과

위 프로그램을 실행하면 다음과 같이 네 방향에 검은색 테두리가 추가된 이미지 창이 생성됩니다.

자바 OpenCV copyMakeBorder()로 이미지에 테두리 추가하는 방법