【问题标题】:OpenCV Distance transform is not working as it supposed toOpenCV 距离变换无法正常工作
【发布时间】:2015-09-28 19:21:23
【问题描述】:

我正在尝试使用 OpenCV 将分辨率为 2048x2048 的图像划分为较小的图像,以用于该像素周围分辨率为 90x90 的某些 *像素。稍后在那些较小的图像上,我想使用 foveation。我在foveation图像上遵循了这个例子,但我使用的是C++。

Image foveation in Python

       Mat mask = Mat::ones(Size(90,90), CV_8UC1) * 255;
       circle(mask, CvPoint(45,45), 30, 0, -1);

       Mat out; // = Mat::ones(Size(90,90), CV_32FC1) * 0;
       distanceTransform(mask, out, CV_DIST_L2, CV_DIST_MASK_PRECISE);


       int scale_factor = 10;
       Mat filtered = outputImage.clone();
       Mat img_float;
       filtered.convertTo(img_float,CV_32F,1,0);

       for(int k = 0; k < 90; k++){  // y
            for(int l = 0; l < 90; l++){  // x
                if(out.at<float>(k,l) == 0.0) continue;

                float mask_val = ceil(out.at<float>(k,l)/scale_factor);
                if(mask_val <= 3) mask_val = 3;

                int beginx = l - int(mask_val/2);
                if (beginx < 0)
                    beginx = 0;

                int beginy = k - int(mask_val/2);
                if (beginy < 0)
                    beginy = 0;

                int endx = l+int(mask_val/2);
                if (endx >= 90)
                    endx = 90-1;

                int endy = k+int(mask_val/2);
                if (endy >= 90)
                    endy = 90-1;

                int num = 0;
                float total = 0; 
                for (int a = beginx; a < endx; a++){
                    for(int b = beginy; b < endy; b++){
                        num ++;
                        total += img_float.at<float>(a,b);
                    }
                }

                filtered.at<float>(k,l) = (total/num);
            }
       }

       namedWindow( "Display window", WINDOW_AUTOSIZE );
       imshow( "Display window", filtered );
       waitKey(0); 
       imwrite( ss.str(), filtered, compression_params );

在这里的另一个问题中,我读到我应该使用 CV_DIST_MASK_PRECISE,而不是使用 3 或 5 作为 distanceTransform 中的参数。

问题是我的Mat out有时是黑色的,有时是白色的带圆圈但无法保存或在代码中使用。

结果如下:

但是当我使用 python 脚本时我没有问题:

规格:

  • 操作系统:Ubuntu 14.04
  • CPU:i7-2600 3.50GHz
  • 内存:8GB

OpenCV 版本。 3.0.0

*我说的是一些像素,大约 300 万像素。

编辑
这是其余的代码。问题中的这一部分就在保存裁剪图像之前进行。
http://pastebin.com/49rLhDcF
Mat outputImage = temp( Rect(lx, ty, abs(rx - lx), abs(by-ty)));

ps:因为有很多像素,在生成大量图像后,我得到 Segmentation fault (core dumped)。我知道这与记忆有关,我正在尝试修复它,但我也想听听您的意见。

【问题讨论】:

  • ` img_float.at(a,b);`
  • 可能你有outputImage 是一个三通道矩阵。您以某种方式弄乱了 1 个通道图像和 3 个通道图像。更多代码可能会有所帮助..
  • @Miki这里是源代码pastebin.com/49rLhDcF我今天刚改了运行。我必须在星期一应用所有更改。到目前为止,问题中的代码在保存修改(裁剪)的图像之前。
  • 我无法理解这段代码是如何与你的代码相关联的
  • @Miki Mat 过滤 = outputImage.clone();好的,这是场景......深度学习项目。你有一张高分辨率的图片,你把它分成每个像素 90x90 的更小的图片。然后在保存之前 imwrite - 你使用 foveation。那部分被拿走了。想象一下,它在第 263 行。它也可能会让你感到困惑,但像素被标记为 ..,这是一个混乱的代码。今晚我会尽量把它变小,功能等等。

标签: python c++ image opencv image-processing


【解决方案1】:

问题解决了,
我只是添加了这一行。

我用高斯模糊对整张图片进行了平滑处理,然后我复制了原始像素的值来预制我想要的效果。

 for(int j = 0; j <  pixels_gray.size(); j++) {
               int x = pixels_gray[j].x;
               int y = pixels_gray[j].y;
               int lx = pixels_gray[j].lx;
               int rx = pixels_gray[j].rx;
               int ty = pixels_gray[j].ty;
               int by = pixels_gray[j].by;

               Mat outputImage = image_original( Rect(lx, ty, abs(rx - lx), abs(by-ty)));

               Mat mask = Mat::ones(Size(90,90), CV_8UC1) * 255;
               CvPoint      c = cvPoint(45, 45);
               circle(mask, c, 30, 0, -1);

               Mat smooth;

               for (int i=1; i<11; i=i+2){
                    GaussianBlur( outputImage, smooth, Size( i, i ), 0, 0 );
                }


                for(int my = 0; my < 90; my++){
                    for(int mx = 0; mx <90; mx++){
                        Scalar colour = mask.at<uchar>(Point(mx, my));
                        if(colour.val[0]==255) continue;
                        smooth.at<Vec3b>(my,mx)[0] = outputImage.at<Vec3b>(my,mx)[0];
                        smooth.at<Vec3b>(my,mx)[1] = outputImage.at<Vec3b>(my,mx)[1];
                        smooth.at<Vec3b>(my,mx)[2] = outputImage.at<Vec3b>(my,mx)[2];
                    }
                }


               stringstream ss;
               ss << dir << "gray_" << y << "_" << x << ".png";
               imwrite( ss.str(), smooth, compression_params );


           }

【讨论】:

    猜你喜欢
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多