이미지에 테두리(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를 통해 윈도우에 출력합니다.
입력 이미지

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