Sharpening Filter LoG (Laplacian of Gaussian)
라플라시안 필터링은 2차 미분을 사용하여 잡음에 민감하다. 잡음을 줄이기 위한 방법으로 입력영상을 가우시안 필터링하여 잡음을 제거한 후에 라플라시안을 적용하는 방법을 사용할 수 있다. 또는 가우시안 함수에 대한 라플라시안을 계산하여 커널을 생성하여 필터ㅇ링할 수 있다. 이러한 필터링을 LoG라고 한다.
출처 : C++ API OpenCV 프로그래밍(책)
코드
int ksize = 15;
GaussianBlur(srcImage,blurImage,Size(ksize,ksize),0.0);
Laplacian(blurImage,lapImage,CV_32F,ksize);
ZeroCrossing(lapImage,dstImage,10);
normalize(dstImage,dstImageConvert,0,255,NORM_MINMAX,CV_8U);
실행결과
설명
아래는 전체 소스 코드 입니다.
void ZeroCrossing(Mat &src, Mat &dst, int th)
{
int x,y;
double a,b;
Mat zeroCrossH(src.size(), CV_32F,Scalar::all(0));
Mat_<float> _src(src);
for(y = 1; y < src.rows-1 ; y++){
for(x = 1; x < src.cols-1 ; x++){
a = _src(y,x);
b = _src(y,x+1);
if(a== 0)
a = _src(y,x-1);
if(a*b < 0)
zeroCrossH.at<float>(y,x) = fabs(a) + fabs(b);
else
zeroCrossH.at<float>(y,x) = 0;
}
Mat zeroCrossV(src.size(),CV_32F,Scalar::all(0));
for(y = 1; y < src.rows ; y++){
for(x = 1; x < src.cols-1 ; x++){
a = _src(y,x);
b = _src(y+1,x);
if(a ==0)
a = _src(y-1,x);
if(a*b < 0)
zeroCrossV.at<float>(y,x) = fabs(a) + fabs(b);
else
zeroCrossV.at<float>(y,x) = 0;
}
Mat zeroCross(src.size(),CV_32F,Scalar::all(0));
add(zeroCrossH,zeroCrossV,zeroCross);
threshold(zeroCross,dst,th,255,THRESH_BINARY);
}
}
}
JNIEXPORT jstring JNICALL
Java_com_tistory_technote_opencvandroid_MainActivity_convertNativeLibtoSharpeningLoG(JNIEnv *env, jobject, jlong addrInput, jlong addrResult) {
Mat &img_input = *(Mat *) addrInput;
Mat &img_result = *(Mat *) addrResult;
cvtColor(img_input, img_result, CV_RGBA2GRAY);
jstring result;
std::stringstream buffer;
Mat srcImage = img_result;
int ksize = 15;
Mat blurImage;
GaussianBlur(srcImage,blurImage,Size(ksize,ksize),0.0);
Mat lapImage;
Laplacian(blurImage,lapImage,CV_32F,ksize);
Mat dstImage;
ZeroCrossing(lapImage,dstImage,10);
Mat dstImageConvert;
normalize(dstImage,dstImageConvert,0,255,NORM_MINMAX,CV_8U);
img_result = dstImageConvert.clone();
buffer << "laplacian ksize = 15";
const char *cstr = buffer.str().c_str();
result = env->NewStringUTF(cstr);
return result;
}
관련문의
- 이메일: [email protected]
- Blog : technote.tistory.com
- Github : https://gitlab.com/Technote/opencv320-android-study