2017-11-10 9 views
1

私のプロジェクトには助けが必要です。私はディスクからカラー画像(ソース画像)を読みました。私の仕事はこの画像にぼかしを適用することです。したがって、添付された画像(左上隅の画像 - エッジ画像)のように、エッジの検出には問題はありません。 関連する質問の4つのステップを適用しました thisthisCv :: Mat画像のみをぼかす方法Canny関数がOpenCVでこの画像のエッジを検出する場所

添付の画像に表示されているように、手順1〜3は間違いなく可能です。第1の画像は検出されたエッジを示し、第2の画像は拡大された前の画像を示し、第3の画像はぼやけた第2の画像を示し、ソース画像をこの画像にコピーする。しかし、最後のステップでは、この画像を最終画像(ソース画像)にコピーして、検出されたエッジがぼやけてしまうようにしたいと考えています。しかし、私がOpenCVライブラリからcopyTo関数を使用すると、結果は画像の結果(右下隅の画像)で見ることができるように、Canny関数が検出するぼかしエッジを持たない。私がやっていることを喜ばせてくれますか?

#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; 
} 

Source Image where I want to blur only edges

Results of my code

This image shows what I want

あなたの助けやアドバイスのために皆のためのビッグ感謝。

+1

あなたのコードの画像へのリンクを投稿しないでください、私たちはあなたの問題を再現するテキストとしてのコードを必要と – EdChum

+0

「結果が悪いですが、」何の適切な説明ではありません。我々は入力を知らないので、どのように出力を判断することができますか? – Piglet

答えて

0

元の画像にぼやけたエッジをコピーバックすると、間違ったマスクが使用されています。 detected_edgesには、Canny検出器の出力が含まれています(スパースピクセルのみ)。マスクがソースイメージのどのピクセルをデスティネーションにコピーできるかを示す場合は、非ゼロピクセル。画像blurredにはぼかしたエッジのみが含まれ、残りのピクセルは黒です。だから私はあなたがコピーのマスクとしてそれを直接使うことができると思います。

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

マスクはCV_8Uタイプである必要があります。あなたの例ではこれが当てはまるようです。そうでない場合は、次のコードを使用して、blurredのピクセルがヌルでない場合を除き、黒のイメージを作成できます。

blurred.copyTo(src, (blurred != 0));  //4 
関連する問題