1

やがて私は少し書いていますseam-carving-アプリケーション

私の問題は、検出された「継ぎ目」を効率的な方法で画像から削除することです。

私は次のコードを持っています:

    private void removePathFromImageV(CvMat img, int[] path){

    int band = 3;

    double ch = 0.0;
        for (int y = 0; y < img.rows()-1; ++y){
            for (int x = path[y]-1; x < img.cols()-1; ++x){

                for (int b = 0; b < band; ++b){
                ch = img.get(y,x+1,b);
                img.put(y,x,b,ch);
            }
        }
    }

}

要素をpath[y]-1からimg.cols()-1にシフトするオプションはありますか?

あいさつ

4

1 に答える 1

2

問題は、行ごとに異なる位置にあるピクセルを抑制しなければならないことです。削除したピクセルの後にすべてのピクセルをシフトする必要があるため、これを行うための画像構造を持つことは効率的ではありません。std::deque画像全体を、ランダムアクセスイテレータを備えた両端キューなどの削除操作に効率的なデータ構造に変換してみることができます。次に、各行の要素を簡単に抑制できます。最後に、構造から適切な画像にコピーして戻すことができます。

これがC++でのアイデアです

// assuming image is a CV_8UC3 image
std::deque<std::deque<cv::Vec3b> > pixelsDeq(image.rows, std::deque<cv::Vec3b>(image.cols));
for (int i = 0; i < image.rows; ++i)
  for (int j = 0; j < image.cols; ++j)
    pixelsDeq[i][j] = image.at<cv::Vec3b>(i, j);

// then remove pixels from the path (remove sequentially for all the paths you probably have)
  for (int j = 0; j < image.rows; ++j) {
    pixelsDeq[j].erase(pixelsDeq[j].begin() + paths[j]);


// at the end, copy back to a proper image
cv::Mat output = cv::Mat::zeros(pixelsDeq.size(), pixelsDeq[0].size(), CV_8UC3);
for (int i = 0; i < output.rows; ++i) {
  for (int j = 0; j < output.cols; ++j) {
    output.at<cv::Vec3b>(i,j) = pixelsDeq[i][j];
  } 
}
于 2012-10-17T09:45:00.743 に答える