C# OpenCV 강좌 : 제 45강 - 피라미드 화상 분할
피라미드 화상 분할(Pyramid Segmentation)
PyrSegmentation
함수를 이용하여 이미지 피라미드
에 의한 화상 분할을 진행합니다.
레벨
을 지정하여 이미지 피라미드를 만들고 이 정보를 이용하여 이미지 분할
을 실행합니다.
원본(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 pyrseg;
public IplImage PyrSegmentation(IplImage src)
{
IplImage srcROI = src.Clone();
pyrseg = new IplImage(src.Size, BitDepth.U8, 3);
int level = 5;
double threshold1 = 255.0;
double threshold2 = 50.0;
CvRect roi = new CvRect()
{
X = 0,
Y = 0,
Width = srcROI.Width & -(1 << level),
Height = srcROI.Height & -(1 << level)
};
srcROI.ROI = roi;
pyrseg = srcROI.Clone();
Cv.PyrSegmentation(srcROI, pyrseg, level, threshold1, threshold2);
return pyrseg;
}
public void Dispose()
{
if (pyrseg != null) Cv.ReleaseImage(pyrseg);
}
}
}
세부 코드
IplImage srcROI = src.Clone();
pyrseg = new IplImage(src.Size, BitDepth.U8, 3);
계산에 사용할 srcROI
를 생성하여 src
를 복사하여 저장합니다.
결과에 사용할 pyrseg
를 생성합니다.
int level = 5;
double threshold1 = 255.0;
double threshold2 = 50.0;
주요 매개변수인 레벨
과 임계값1
, 임계값2
를 선언합니다.
레벨
은 비트 연산시 사용할 값입니다.
레벨
값이 높을 수록 보여지는 이미지가 일부 누락될 수 있습니다.
임계값
은 이진화
함수에서 사용되는 임계값과 동일한 역할을 합니다.
CvRect roi = new CvRect()
{
X = 0,
Y = 0,
Width = srcROI.Width & -(1 << level),
Height = srcROI.Height & -(1 << level)
};
관심 영역으로 사용할 roi
를 생성합니다.
너비
와 높이
를 AND
연산을 통하여 좌측으로 쉬프트 시킵니다. 2의 보수법
을 사용합니다.
srcROI.ROI = roi;
pyrseg = srcROI.Clone();
srcROI
에 관심 영역
을 적용합니다.
관심 영역
이 적용된 srcROI를 pyrseg
에 복사합니다.
Cv.PyrSegmentation(srcROI, pyrseg, level, threshold1, threshold2);
Cv.PyrSegmentation()
을 적용합니다. PyrSegmentation(원본, 결과, 레벨값, 임계값1, 임계값2)
를 사용합니다.
출력 결과
level 1
level 2
level 3
level 5
level 1, threshold2 100
level 1, threshold2 150
공유하기


댓글 남기기