#include #include #include #include using namespace std; using namespace cv; class myLaplacian { private: // laplacian Mat laplace; // size of the laplacian kernel int kernelSize; public: myLaplacian() : kernelSize(3) {} // Set size of the kernel void setKernelSize(int inputAperture) { kernelSize = inputAperture; } // computer the floating point Laplacian Mat computeLaplacian(const Mat& inputIma..
가끔씩 영상에서 방향성을 계산해야하는 상황이 생긴다. 예를들어 영상에서 두 픽셀 사이에 값을 interpolation 하는 상황이 생길 수 있는데(image sensor level), 방향성을 갖는 부분에서 이전에 언급했던 bilinear interpolation을 한다거나, 일반적인 interpolation 방식을 사용하게 되는 경우 화질적인 측면에서는 눈에 잘 보이는 artifact들이 생겨날 수 있다. 영상에서 방향성이 있는 부분이라면 그 방향성을 따져서 처리를 해줘야 하기 때문이다.(대각선으로 gradation이 있는 선을 생각해보자, 대각선 방향 line을 따라서 interpolation을 해야하지 주위 픽셀을 모두 사용하면 artifact들이 생겨날 수 있음.) 따라서 이번 시간에는 영상에서 ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/wNpt4/btquLpdIkcg/CKWLjmObJy11osgB2nASkk/img.png)
이번 시간에는 Median filter에 대해서 알아보도록 한다. 효과 및 비교를 위해 03. Accessing pixel values 에서 다루었던 salt and pepper noise와 07. mean / gaussian filter 에서 다루었던 mean filter를 사용한다. 먼저 이전에 배웠던 Mean filter에 대해 간단하게 다시 다루면, center pixel을 중심으로 kernel에서 같은 weight를 적용하여 값을 변경한다. 이 경우 white pixel(혹은 black pixel)은 mean filter를 적용하는 과정에서 큰 영향을 끼칠 수 있다. (bad pixel과 같이 눈에 띄는 상황이라면 dot artifact가 생겨날 수 있다.) Median filter는 mean ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/elDK8A/btquHRIcgqk/ljihZfb2fuwkqjAtNh29Fk/img.png)
이번 주제에서는 DownSampling과 그 과정에서 사용되는 filter 이야기를 해보고자 한다. 이미지의 사이즈를 줄이는 것을 Downsampling이라고 하는데(반대는 Upsampling), 사이즈를 줄이는 것은 생각보다 간단하지 않다. 결과를 먼저 보자. 위는 low pass filter를 사용하지 않고 downSampling을 한 것이며, 아래는 사용 후 진행한 것이다. 위의 영상에서는 image의 quality가 좋지 않다. (자연스럽지 않고, pixel간 차이가 너무 커서 경계가 있어 보인다. 아래는 blur해보이지만, 둘 중 한 가지를 선택한다면 아래를 선택하는 것이 원본의 신호를 그나마 더 잘 표현하였다.) Low pass filter를 사용하지 않고 downsampling을 진행하면 왜..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/ckiWNr/btquFdh5zuX/XEMhhpBuhf7SY4h82626J1/img.png)
이전까지 간단하게 openCV에서 이미지를 불러오고 pixel value에 접근하고 수정하는 법을 배웠는데, 앞으로 한동안 filter에 대해서 배워보고자 한다. (중간을 건너뛰는 이유는 단순하게 filter가 먼저 궁금해서이다.. 나중에 다시 다룰 기회가 있지 않을까 싶다.) 앞으로 문서로 남기는 것이 더 좋을 것 같아서 PPT로 요약 후 그 내용으로 대체하고자 한다. (+ 글이 많으면 읽기가 귀찮다. 한눈으로 볼 수 있게 노력할 예정... 블로그 글에는 약간의 코멘트는 더 추가할 생각이다.) #include #include #include #include using namespace std; using namespace cv; int main() { Mat original = imread("lena...
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bkbdSl/btquzGms7Sl/YykzkhhsSIjnQOYRtOTmpK/img.png)
함수를 구현하는 방법에는 여러 가지 방법이 있을 수 있다. 그 방법에 따라서 알고리즘의 성능이 달라질 수 있는데, 특별한 상황에서는 정확도가 떨어지더라도 더 빨리 계산을 해야 하는 상황이 있을 수 있다. (예로 자율주행차량에 사용되는 센서의 경우 빠른 처리가 뒷받침이 되어야겠지만, 스마트폰에서 사용하는 사진 보정 app의 경우 처리 속도는 약간 느리더라도 사용자가 마음에 드는 결과를 출력하는 것이 더 중요할 수 있다.) 비슷하게 내가 구현한 프로그램의 성능을 테스트해야 하는 상황이 있는데, 이번에는 openCV 제공하는 방식을 통해 프로그램의 실행 속도를 측정해본다. 이전 글을 통해서 color reduction 함수 예제를 기존 방식과 좀 더 효율적인 bitwise operation을 통한 방식으로 구..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/lM9b8/btquz9HMWGX/9LivwLBofyrAt240jzBOf0/img.png)
이전 포스트에서는 Mat class의 data를 pointer를 사용하여 scanning하는 것을 다루었다. 이번에는 iterator를 사용하여 진행해보도록 한다. 예제는 이전과 같이 color reduction을 진행하고, scanning 방식만 변경하도록 한다. 코드와 결과를 먼저 보면 다음과 같다. #include #include #include using namespace std; using namespace cv; void colorReduction(Mat image, int div = 64) { // div must be a power of 2 int n = static_cast( log(static_cast(div)) / log(2.0) + 0.5); // mask used to round ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/SVAu0/btquj2oCH6e/hrpoNyuZCdF3qFMcGa2JV1/img.png)
openCV에서 포인터로 픽셀에 접근하는 법을 배워본다. 포인터로 접근하는 것은 영상의 사이즈가 커지거나, 빠른 처리 속도를 요구하는 환경에서 도움이 될 수 있을 것이다. 예제는 포인터를 이용하여 픽셀에 접근한 후, 영상의 color reduction을 진행한다. color reduction 알고리즘 및 영상의 데이터를 효율적으로 접근하는 방법들을 중점으로 알아본다. 우선 8bit(256) 기준으로, R.G.B 3 색 영역에서 나올 수 있는 색의 수는 256 * 256 * 256으로 16,777,216 가지이다. 분석의 복잡도를 줄이기 위하여 때때로 이 색 영역을 줄여야 하는 상황이 있을 수 있다. 가장 쉬운 방법으로는 RGB space를 동일한 사이즈로 줄이는 것이다. 예로 8로 각 dimension을..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/oZmbj/btqufccUggG/3iAwGbtV2WUHgTR8J3TXUk/img.png)
opencv에서 영상을 read 후 그 영상의 pixel에 접근하여 처리하는 경우가 있다. 이전 단계에서 이미지를 read 하고, Mat class에 대해서 간단하게 배워보았는데, 이번에는 image의 pixel의 값에 접근 후 수정하는 법을 알아본다. 예제는 영상을 read 후 n개의 픽셀을 white로 변경하는 fuction을 작성 후 효과를 확인할 것이다. 우선 image의 type에 따라서 white로 바꾸는 방법이 달라질 것이다. 1. 영상이 일반적인 grayscale이라면 8 bit unsigned를 사용한다. 따라서 pixel value의 range는 0 ~ 255로 해당 pixel의 값을 255로 바꾸는 방식으로 만들 수 있다. (case에 따라서 bit 수는 변경될 수 있겠다.) 2. 영..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/pZ81f/btqt0TGovfW/1xLAdamLeTMsubIBW1802k/img.png)
opencv의 Mat class에 대해 간략하게 볼 수 있는 예제 코드를 작성해보았다. #include #include #include using namespace std; using namespace cv; // test function that creates an image Mat getGrayImage() { // create image Mat image(Size(500, 500), CV_8U, 50); // fucntion instruction /** @overload @param rows Number of rows in a 2D array. @param cols Number of columns in a 2D array. @param type Array type. Use CV_8UC1, ..., ..
- Total
- Today
- Yesterday
- morphology
- segmentation
- bilateral filter
- OpenCV
- difference of gaussian
- morphological operation
- pyrUp
- laplacian of gaussian
- 캐니 엣지
- pyrDown
- top hat
- canny operator
- upsampling
- erosion
- black top hat
- equalizing
- dilation
- median filter
- 영상처리
- Low pass filter
- Line Detection
- gradient
- canny
- hough transform
- adaptive thresholding
- direction detection
- Filter
- Sobel
- high pass filter
- mean filter
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |