이미지 처리에서 영역을 분할하는 방법들은 다양합니다. OpenCV에서 제공하는 기능 중 floodFill도 영역을 분할 하는 방법들 중에 하나 입니다. 응용에서는 물체 추적에 전처리나 배경 제거, 물체의 영역 채우기 등에 활용됩니다.
아래는 파이썬에서 활용하는 함수 형태와 C/C++에서 사용하는 함수 예 입니다. C/C++에서 활용하는 함수는 두 가지 형태인데 mask 유무가 차이 입니다.
(Python) retval, image, mask, rect = cv2.floodFill(image, mask, seedPoint, newVal,
loDiff=None, upDiff=None, flags=None)
(C/C++) int floodFill(InputOutputArray image, Point seedPoint, Scalar newVal,
Rect* rect = 0, Scalar loDiff = Scalar(), Scalar upDiff = Scalar(), int flags = 4);
(C/C++) int floodFill(InputOutputArray image, InputOutputArray mask, Point seedPoint,
Scalar newVal, Rect* rect = 0, Scalar loDiff = Scalar(), Scalar upDiff = Scalar(), int flags = 4);
파라미터 설명은 아래와 같으며 실무 적용에서는 mask 활용할 때와 아닐 때만 유의하면 됩니다.
1) image: 입력 이미지이자 처리 대상 이미지이며 그레이 이미지와 칼라 이미지 적용 가능합니다.
2) mask: 어떤 부분을 채울 때 채우기 작업을 제한하는 역할을 합니다. 예를 들어 영역의 에지를 추출한 Binary 이미지라면 “0”인 부분만 특정 값으로 채울 수 있습니다. 8-bit 그레이 이미지로 정의해야 하며, 원본 이미지보다 가로와 세로가 2 픽셀씩 커야 합니다. 추가로 마스크의 테두리는 “1”로 채우며, 동일한 마스크를 여러번 사용해도 채워진 영역이 겹치지 않도록 할 수 있습니다.
3) seedPoint: 값을 변경하는 시작 좌표(x, y) 입니다.
4) newVal: 변경할 픽셀값 또는 색상 입니다. 칼라라면 (255, 10, 10) 형태가 됩니다.
5) loDiff: 변경할 픽셀값의 하한값 입니다.
6) upDiff: 변경할 픽셀값의 상한값 입니다.
7) flag: 변경 처리 조건을 지정합니다.
flag에는 아래 두 가지가 있으며, 실제 적용 시에는 픽셀 연결 방식인 4방향 또는 8방향과 조합해서 사용할 수 있습니다.
(flag)
1) FLOODFILL_FIXED_RANGE: 정의된 상한 및 하한 픽셀값 비교
2) FLOODFILL_MASK_ONLY: 입력 이미지는 변화 없으며 mask를 업데이트
(connectivity) 상하좌우 4방향과 대각 포함한 8방향으로 비교
아래 예는 mask를 사용하지 않는 파이썬 및 C/C++ 코드 입니다. “flag” 부분을 살펴보면 “flags=4 | cv2.FLOODFILL_FIXED_RANGE”과 “4 | FLOODFILL_FIXED_RANGE”로 정의 되었으며, 4방향 + 정의된 상한 및 하한 픽셀값 비교 로 동일한 의미로 적용되었음을 알 수 있습니다.
import cv2
import numpy as np
# 이미지 로드 및 복사
img = cv2.imread('image.jpg')
im_floodfill = img.copy()
# 마스크 생성
h, w = img.shape[:2]
mask = np.zeros((h+2, w+2), np.uint8)
# 위치 및 변환값
seed_point = (125, 125)
new_val = (255, 0, 0)
cv2.floodFill(im_floodfill, mask, seed_point, new_val,
loDiff=(5, 5, 5), upDiff=(5, 5, 5),
flags=4 | cv2.FLOODFILL_FIXED_RANGE)
cv2.imshow("Filled Image", im_floodfill)
cv2.waitKey(0)
cv2.destroyAllWindows()
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
// 이미지 로드
Mat img = imread("image.jpg");
// 마스크 생성
Mat mask = Mat::zeros(img.rows + 2, img.cols + 2, CV_8UC1);
// 위치 및 변환값
Point seedPoint(125, 125);
Scalar fillColor(255, 0, 0);
floodFill(img, mask, seedPoint, fillColor,
0, // rect 포인터 (필요 없으면 0)
Scalar(5,5,5), // loDiff
Scalar(5,5,5), // upDiff
4 | FLOODFILL_FIXED_RANGE); // flags
// 결과 출력
imshow("Flood Filled", img);
waitKey(0);
return 0;
}
'영상처리 도구' 카테고리의 다른 글
OpenCV 적응적 이진화 방법 Adaptive Thresholding (Python, C++) (0) | 2025.05.28 |
---|---|
딥러닝, 컴퓨터 비전, 영상처리 라이브러리 Image Processing Library (0) | 2025.05.18 |
OpenCV 영상처리 기술 보간법 Interpolation (0) | 2025.05.15 |
OpenCV 칼라 처리 및 변환 cvtColor (0) | 2023.12.10 |
OpenCV 이미지 산술연산과 논리연산, 혼합 Image Blending (0) | 2023.11.26 |