1) 프로파일

영상에서 특정 경로(라인 또는 곡선) 상에 있는 픽셀의 밝기 값을 그래프 형태로 나타낸것. 

(Line profile, intensity profile)

#include <iostream>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

Mat src, dst, profile;
int row = 0;
void on_trackbar(int, void*) {
	src.copyTo(dst);
	profile.setTo(255); // profile 이미지 흰색으로 초기화
	
	uchar* pSrc = (uchar*)src.ptr<uchar>(row);  // track바가 가리키고있는 첫번째행의 주소값을 pSrc, pDst 가 받음
	uchar* pDst = (uchar*)dst.ptr<uchar>(row);

	for (int x = 1; x < src.cols; x++) {
		line(profile, Point(x - 1, 255 - pSrc[x - 1]), Point(x, 255 - pSrc[x]),0);  // profile 이미지에서 꺽은 선 그래프 그리는 라인함수
		pDst[x] = saturate_cast<uchar>(pSrc[x] + 50); //dst 영상에서 입력영상 + 50 의 값을 dst에 할당 , 트랙바가 가리키고있는 행 위치 픽셀값이 밝은 형태로 나타남.
	}

	imshow("dst", dst);
	imshow("profile", profile);
}
int main()
{
	 src = imread("lenna.bmp", IMREAD_GRAYSCALE);

	if (src.empty()) {
		cerr << "Image laod failed!" << endl;
		return -1;
	}

	GaussianBlur(src, src, Size(), 1); // 가우시안블러가 적용함에따라 노이즈 제거 그러나 노이즈뿐만 아니라 엣지에서도 블러링이 적용됨
	namedWindow("dst");
	namedWindow("profile");
	profile.create(256, src.cols, CV_8UC1);  // profile 그릴 이미지 생성, rows: 256( 세로크기 grayscale 범위 적용 , 가로크기는 입력영상 가로크기와 동일)
	createTrackbar("Profile", "dst", &row, src.rows - 1, on_trackbar, NULL); // dst창에 Profile 이름가진 트랙바 생성. 트랙바 위치 &row 정수 위치, 범위: 0 ~ src.rows - 1 
	on_trackbar(0, 0);
	waitKey();
}

 

 

#2 양방향 필터https://docs.opencv.org/4.x/d4/d86/group__imgproc__filter.html#ga9d7064d478c95d60003cf839430737ed

엣지가 아닌 부분에서만 블러링.(연산속도는 가우시안보다 많이 느림)

 

#include<iostream>
#include"opencv2/opencv.hpp"

using namespace std;
using namespace cv;

int main(void) {
	Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);
	if (src.empty()) {
		cerr << "Img load failed!" << endl;
		return -1;
	}
	TickMeter tm;
	tm.start();
	Mat dst1;
	GaussianBlur(src, dst1,Size(), 5); // Size는 자동 설정, sigma:5 , 
	tm.stop();
	cout << "Gaussian: " << tm.getTimeMilli() << endl;

	tm.reset();
	tm.start();
	Mat dst2;
	bilateralFilter(src, dst2, -1, 10, 5); // 3번째 인자 -1 일 시 5번째인자 sigma값에 의해 자동으로 사이즈 결정
	//4번쨰 인자: 픽셀 값 차이가 10 이하인 값들에 대해 bilateralfilter적용. 적을 수록 적용이 많이 되고 클 수록 적용이 안됨
    //100으로 설정시 거의 gausian만 적용됨
    tm.stop();
	cout << "Bilateral: " << tm.getTimeMilli() << endl;
	imshow("src", src);
	imshow("dst1", dst1);
	imshow("dst2", dst2);
	waitKey();

}

 

 

 

 

 

gausian vs bilateralfilter 시간차이

+ Recent posts