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 시간차이
'프로그래머스 > OPENCV' 카테고리의 다른 글
영상의 기하학적 변환(geometric transformation) (0) | 2022.12.05 |
---|---|
1주차 과제) 히스토그램 개선해서 명암비가 좋은 결과 이미지 만들기 (0) | 2022.12.03 |
블러링 (0) | 2022.12.02 |
영상의 필터링 - 엠보싱필터링 (0) | 2022.12.02 |
opencv 동영상 (1) (0) | 2022.12.02 |