私は今この問題を理解するために何か助けが必要です。 私は、異なるものだけが同じである3つの画像を持っています、彼らは青、緑、赤を表しています。私はそれらを組み合わせて、色付きのイメージを取り戻す必要があります。 私はopencvとC++を使用していますが、今私はこの問題を把握できません。xで1回、y方向に1回、第1ソーベルの導関数を計算し、これらの2つを結合してください(チャンネルごとに)
が必要です。エッジ検出には、が必要です。
----更新---- は、私はこの結果bad example
を得る。しかし、それはこのようにする必要があり、いくつかの新しいコード
Sobel(img_r, x, CV_16S, 1, 0);
Sobel(img_r, y, CV_16S, 0, 1);
//Compute the L1 norm
sobel_L1_norm = abs(x)+abs(y);
//Find Sobel max value
minMaxLoc(sobel_L1_norm, &min, &max);
sobel_L1_norm.convertTo(sobel_image, CV_32F, 255.0/(max - min), -min * 255.0/(max - min));
threshold(sobel_image, edgeThreshold, min, 255, THRESH_BINARY);
edgeThreshold.copyTo(img_r_edge);
を書きました。 correct one
---- FULL CODE -----
Mat img_r = imread(input_path + "/01.png", CV_LOAD_IMAGE_GRAYSCALE);
Mat img_g = imread(input_path + "/02.png", CV_LOAD_IMAGE_GRAYSCALE);
Mat img_b = imread(input_path + "/03.png", CV_LOAD_IMAGE_GRAYSCALE);
// Edge Images
Mat img_r_edge = Mat::zeros(img_r.size(), CV_8UC1);
Mat img_g_edge = Mat::zeros(img_g.size(), CV_8UC1);
Mat img_b_edge = Mat::zeros(img_b.size(), CV_8UC1);
std::cout << "Step 1 - calculating edge images... ";
// TODO: 1) Calculate the 1st Sobel derivative once in x and once in y direction and combine these two
// (for every channel).
Mat x;
Mat y;
Mat abs_x;
Mat abs_y;
Mat sobel_L1_norm;
Mat sobel_image;
Mat edgeThreshold;
double min, max; //Finding min and max Sobel valuye;
//---------------------------------------------------
Sobel(img_r, x, CV_16S, 1, 0);
Sobel(img_r, y, CV_16S, 0, 1);
//Compute the L1 norm
sobel_L1_norm = abs(x)+abs(y);
//Find Sobel max value
minMaxLoc(sobel_L1_norm, &min, &max);
sobel_L1_norm.convertTo(sobel_image, CV_32F, 255.0/(max - min), -min * 255.0/(max - min));
threshold(sobel_image, edgeThreshold, min, 255, THRESH_BINARY);
edgeThreshold.copyTo(img_r_edge);
//----------------------------------------------------
// 2) Normalize every gradient image and convert the results to CV_8UC1.
// 3) Threshold the retrieved (normalized) gradient images using the parameter "edgeThreshold".
// 4) Save the results in the cv::Mats below.
imwrite(out_r_edge_filename, sobel);
imwrite(out_g_edge_filename, img_g_edge);
imwrite(out_b_edge_filename, img_b_edge);
_How_あなたがそれらを結合するのでしょうか?私は各グレー画像の「大きさ」を計算して、3つの大きさを追加します。 (クリップを避けるために浮動小数点画像を使用する) – Miki
これは関数addWeighted.Butで動作するはずです。実際には手がかりがありません – twistedhat
私はいくつかの例を掲示して答えました。私は実際にそれを試みることなくコードを書き留めることに注意してください、間違いがあるかもしれません...しかし、あなたはその考えを理解する必要があります – Miki