2017-11-28 4 views
0

그레이 스케일 이미지 (cv::Mat)로 요소를 처리하고 특정 조건을 충족하는지에 따라 1 또는 0을 지정하려고합니다. 이제는 생성 된 1과 0에서 이진 이미지를 생성하는 방법에 대한 질문이 생깁니다. 글쎄,이 사람이이 video에서 한 것처럼 cv::calcOpticalFlowPyrLK에 대한 인수로 그 이진 이미지를 던지기를 원하기 때문입니다 (Lucas-Kanade에 대한 이진 이미지를 전달할 수 있다고 가정합니다. 그렇지 않으면 사과합니다. 여전히 OpenCV에 새로운 것).그레이 스케일 이미지를 임계 값없이 바이너리로 변환

어쨌든 새로운 cv::Mat binImg(grayImg.rows, grayImg.cols, CV_8UC1);을 선언하고 값을 할당하기 위해 해당 행렬을 반복해야합니까?

도움을 주시면 감사하겠습니다. 고맙습니다!

C++ :

+1

이 방법은 매우 고밀도의 흑백 이미지에서 작동 할 수 있지만 권장하지 않습니다. 옵티컬 플로우는 흑백 이미지에 크게 위배되는 밝기 불변성을 가정 한 상태에서 작동합니다. 이제는 두 프레임에서 변하지 않는 충분한 * 흑백 픽셀이 있으면 작동 할 수 있지만 알고리즘을 자체 가정을 위반하는 방식으로 적용한다는 점에 유의하십시오. –

+0

하지만 그 방법은 '매트'를 만드는 방법입니다. –

+0

@AlexanderReynolds 답변 해 주셔서 다시 한 번 감사드립니다. 바이너리 이미지와 옵티컬 플로우에 대해 나는 몰랐다. 나는'calcOpticalFlowPyrLK'를 호출 한 결과로 얻을 수있는 점 집합을 처리하기 위해 그 사람의 비디오를 기반으로 준 집적 광학 흐름 연산을 수행 할 수 있다는 희망에 착수했습니다. – JDBones

답변

1

당신은 compare를 사용할 수 무효 비교 (InputArray의 SRC1, InputArray의 SRC2, OutputArray DST, INT cmpop)

의 핵심 아이디어는 같은 크기의 매트에 기준을 인코딩하는 것입니다 그것을 사용하여 소스 이미지와 비교하십시오. 다음은 그 예입니다.

하자 당신의 기준은 포물선 곡선이라고 말할 :

x는 이미지 행 (0-512) 인 y는 일반 그레이 스케일 (255)되도록

enter image description here

. 사용이 그림에 기준을 적용하는 비교보다

enter image description here

:이 기준을 감안할 때 회색 이미지를 그릴 수

enter image description here

내가이 예에서 포물선을 사용, 물론 자신의 기준과 필요에 맞게 모델을 수정해야합니다.

#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/highgui/highgui.hpp> 

#include "opencv2/photo.hpp" 

#include <iostream> 

using namespace std; 
using namespace cv; 

int main() { 

    Mat src = imread("Lenna.png", CV_LOAD_IMAGE_GRAYSCALE); 

    namedWindow("src", WINDOW_AUTOSIZE); 
    imshow("src", src); 

    Mat someGradientMat(src.size(), CV_8U, Scalar(0)); 

    int limit = src.size().height; 

    double a = -255.0*4.0/(limit*limit); 
    double b = 255.0*4.0/limit; 
    double c = 0; 

    for (int r = 0; r < limit; r++) { 

     //value is the parabole y = ax^2 + b + c 
     int value = (int)(a*r*r + b*r + c); 

     someGradientMat.row(r).setTo(value); 
    } 
    namedWindow("someGradientMat", CV_WINDOW_NORMAL); 
    imshow("someGradientMat", someGradientMat); 

    Mat dst; 
    compare(src, someGradientMat, dst, CMP_LT); 

    namedWindow("dst", CV_WINDOW_NORMAL); 
    imshow("dst", dst); 

    waitKey(0); 

    return 0; 
} 
관련 문제