及时我正在写一点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);
}
}
}
}
是否可以选择将元素从路径[y] -1切换到img.cols() - 1?
问候
答案 0 :(得分:2)
您的问题是您必须为每一行抑制不同位置的像素,并且使用图像结构来执行此操作效率不高,因为您必须在删除的像素之后移动所有像素。您可以尝试将整个图像转换为对删除操作有效的数据结构,例如在C ++中,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];
}
}