2017-11-10 29 views
1

프로젝트에 도움이 필요합니다. 디스크에서 컬러 이미지 (원본 이미지)를 읽었으며이 작업에서는 Canny 함수가이 이미지의 가장자리를 감지하는 경우에만이 이미지에 흐림 효과를 적용합니다. 따라서 첨부 된 이미지 (상단 왼쪽 이미지 - 에지 이미지)에서 볼 수 있듯이 가장자리 감지는 문제가 없습니다. 관련 질문 thisthis의 4 단계를 적용했습니다.Cv2 :: Mat 이미지 만 흐리게 처리하는 방법 (Canny 함수는 OpenCV로이 이미지의 가장자리를 감지합니다)

첨부 된 이미지에서 볼 수있는 것처럼 1-3 단계가 정확합니다. 첫 번째 이미지는 감지 된 가장자리를 표시하고 두 번째 이미지는 확장 된 이전 이미지를 표시하고 세 번째 이미지는 흐린 두 번째 이미지를 표시하고 소스 이미지는이 이미지에 복사합니다. 그러나 마지막 단계에서이 이미지를 최종 이미지 (원본 이미지)에 복사하여 감지 된 가장자리가 흐려 지도록합니다. 그러나 OpenCV 라이브러리에서 copyTo 함수를 사용하면 결과에 그림 결과 (오른쪽 하단 모서리 이미지)에서 볼 수있는 것처럼 Canny 함수가 감지하는 흐려진 가장자리가 없습니다. 내가하는 일을 제발 도와 줄 수 있니? 여러분의 도움과 조언을 위해 모두를 위해

Source Image where I want to blur only edges

Results of my code

#include <cstdlib> 
#include <iostream> 
#include <QCoreApplication> 
#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 

using namespace cv; 

Mat src, src_gray; 
Mat detected_edges; 
Mat blurred; 

int edgeTresh = 1; 
int lowThreshold; 
int const max_lowThreshold = 100; 
int ratio = 3; 
int kernel_size = 3; 
char* window_name = "Edge Image"; 
char* window_name2 = "Dilated"; 
char* window_name3 = "Blurred"; 
char* window_name4 = "Result"; 

void CannyThreshold(int, void*) 
{ 
    //reducing noise 
    blur(src_gray, detected_edges, Size(3,3)); 

    //Canny function for detection of edges 
    Canny(detected_edges,detected_edges, lowThreshold,lowThreshold*ratio, kernel_size); 
    //show detected edges in source image 
    imshow(window_name, detected_edges); 

    //4 steps from stack owerflow 
    dilate(detected_edges, blurred, Mat()); //1 
    imshow(window_name2, blurred); 

    src.copyTo(blurred,blurred);   //2 
    blur(blurred, blurred ,Size(10,10)); //3 
    imshow(window_name3, blurred); 

    //here can by a problem when I copy image from step 3 to source image with detected_edges mask. 
    blurred.copyTo(src,detected_edges);  //4 
    imshow(window_name4, src);    //final image 
} 

int main(int argc, char *argv[]) 
{ 
    //reading image 
    src = cv::imread("/home/ja/FCS02/FCS02_3/imageReading/drevo.png"); 
    if(!src.data) 
     return -1; 

    //convert to gray 
    cvtColor(src,src_gray,CV_BGR2GRAY); 

    //windows for showing each step image 
    namedWindow(window_name,CV_WINDOW_NORMAL); 
    namedWindow(window_name2,CV_WINDOW_NORMAL); 
    namedWindow(window_name3,CV_WINDOW_NORMAL); 
    namedWindow(window_name4,CV_WINDOW_NORMAL); 

    //trackbar 
    createTrackbar("Min Threshold:",window_name, &lowThreshold, max_lowThreshold,CannyThreshold); 

    //detection of edges 
    CannyThreshold(0,0); 

    cv::waitKey(300000); 

    return EXIT_SUCCESS; 
} 

This image shows what I want

큰 감사를드립니다.

+1

코드의 이미지에 링크를 게시하지 마십시오, 우리는 문제 – EdChum

+0

을 재현 텍스트로 코드를 필요로 "결과가 나쁘다"더 적절한 설명은 없다. 우리는 입력을 모릅니다. 어떻게 출력을 판단 할 수 있습니까? – Piglet

답변

0

원본 이미지에서 흐려진 가장자리를 다시 복사하면 잘못된 마스크가 사용됩니다. detected_edges에는 Canny 감지기의 출력이 포함됩니다 (일부 스파 스 픽셀 만 해당). 마스크가 소스 이미지의 픽셀을 대상에 복사 할 수있는 경우 비 제로 픽셀입니다. 이미지 blurred에는 흐리게 처리 된 가장자리 만 포함되고 나머지 픽셀은 검정색으로 표시됩니다. 그래서 나는 당신이 복사물의 가면으로 직접 사용할 수 있다고 생각합니다.

blurred.copyTo(src, blurred);  //4 

마스크는 CV_8U 유형이어야합니다. 귀하의 예에서는 이것이 사실 인 것 같습니다. 그렇지 않은 경우 다음 코드를 사용하여 blurred의 픽셀이 null이 아닌 경우를 제외하고 검정색 이미지를 만들 수 있습니다.

blurred.copyTo(src, (blurred != 0));  //4