C# OpenCV 강좌 : 제 46강 - 피라미드 평균 이동 분할
피라미드 평균 이동 분할(Pyramid Mean Shift Filtering)
PyrMeanShiftFiltering
함수를 이용하여 이미지 피라미드
에 의한 평균 이동 분할을 진행합니다.
레벨
을 지정하여 이미지 피라미드를 만들고 이 정보를 이용하여 이미지 분할
을 실행합니다.
공간 윈도우 반경
과 색상 윈도우 반경
을 사용하여 평균 공간 값
과 평균 색 벡터
로 최종 값이 설정됩니다.
피라미드 평균 이동 분할은 매우 높은 계산 시간을 요구
합니다.
적절한 이미지의 크기와 매개 변수 값을 사용해야합니다.
원본(Source, src)
은 영상이나 이미지를 사용합니다.
-
영상 사용하기
: [3강 바로가기][3강] -
이미지 사용하기
: [4강 바로가기][4강]
메인 코드
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;
namespace Project
{
class OpenCV : IDisposable
{
IplImage pyrmean;
public IplImage PyrMeanShiftFiltering(IplImage src)
{
IplImage srcROI = src.Clone();
pyrmean = new IplImage(src.Size, BitDepth.U8, 3);
int level = 2;
double spatial_radius = 30.0;
double color_radius = 30.0;
CvRect roi = new CvRect
{
X = 0,
Y = 0,
Width = srcROI.Width & -(1 << level),
Height = srcROI.Height & -(1 << level)
};
srcROI.ROI = roi;
pyrmean = srcROI.Clone();
Cv.PyrMeanShiftFiltering(srcROI, pyrmean, space_radius, color_radius, level, new CvTermCriteria(3, 1));
return pyrmean;
}
public void Dispose()
{
if (pyrmean != null) Cv.ReleaseImage(pyrmean);
}
}
}
세부 코드
IplImage srcROI = src.Clone();
pyrmean = new IplImage(src.Size, BitDepth.U8, 3);
계산에 사용할 srcROI
를 생성하여 src
를 복사하여 저장합니다.
결과에 사용할 pyrmean
를 생성합니다.
int level = 2;
double space_radius = 30.0;
double color_radius = 30.0;
주요 매개변수인 레벨
과 공간 윈도우 반경
, 색상 윈도우 반경
을 선언합니다.
레벨
은 비트 연산시 사용할 값입니다.
레벨
값이 높을 수록 보여지는 이미지가 일부 누락될 수 있습니다.
공간 윈도우 반경
은 각각의 픽셀(X, Y)에서 계산될 픽셀(x, y)의 범위를 설정합니다.
색상 윈도우 반경
은 픽셀의 성분 벡터(R, G, B)에서 공간 윈도우 반경의 픽셀 성분 벡터(r, g, b)를 뺏을 때의 허용치입니다.
공간 | 색상 |
---|---|
(X, Y) | (R, G, B) |
(x, y) | (r, g, b) |
공간 | 계산식 |
---|---|
x | X - spatial radius ≤ x ≤ X + spatial radius |
y | Y - spatial radius ≤ y ≤ Y + spatial radius |
색상 |
---|
││(R,G,B) - (r, g, b)││ ≤ color_radius |
CvRect roi = new CvRect()
{
X = 0,
Y = 0,
Width = srcROI.Width & -(1 << (level + 1)),
Height = srcROI.Height & -(1 << (level + 1))
};
관심 영역으로 사용할 roi
를 생성합니다.
너비
와 높이
를 AND
연산을 통해 좌측으로 쉬프트 연산을 진행합니다. 2의 보수법
을 사용합니다.
srcROI.ROI = roi;
pyrmean = srcROI.Clone();
srcROI
에 관심 영역
을 적용합니다.
관심 영역
이 적용된 srcROI를 pyrmean
에 복사합니다.
Cv.PyrMeanShiftFiltering(srcROI, pyrmean, space_radius, color_radius, level, new CvTermCriteria(3, 1));
Cv.PyrMeanShiftFiltering()
을 적용합니다.
Cv.PyrMeanShiftFiltering(원본, 결과, 공간 윈도우 반경, 공간 색상 반경, 레벨, 종결기준)
을 사용합니다.
종결기준
은 new CvTermCriteria(최대반복횟수, 정확성)
을 사용합니다.
출력 결과
level 2, space_radius 30.0, color_radius 30.0
level 2, space_radius 60.0, color_radius 30.0
level 2, space_radius 30.0, color_radius 60.0
level 2, space_radius 60.0, color_radius 60.0
level 2, space_radius 30.0, color_radius 60.0, CvTermCriteria(7, 3)
공유하기


댓글 남기기