如何在opencv中填充二进制图像的一面?

时间:2014-02-06 15:05:15

标签: opencv image-processing binary-data fill

我有一张二进制图片。 我想把它的一些部分完全填满黑色并保持白色。 我想要的最好在这里解释一下 - http://www.roborealm.com/tutorial/Obstacle_Avoidance/slide020.php 解释 - 我从右下角开始,到达左上角。如果我找到任何非黑色像素,所有具有Y坐标的像素和具有相同X坐标的像素将变为黑色。这通过从图像的底部开始并逐个像素地填充每个空的黑色像素直到非 - 看到黑色像素。填充然后停止垂直列并继续下一个。

我在opencv中为它编写了一个代码。 我只提到该特定部分的代码。

for (int j =dst.cols; j>=0; j--) {
    for (int i =dst.rows; i>=0; i--) {
        if (dst.at<char>(i,j) == 0){
            dst.at<char>(i,j)=255;
        }  
        if (dst.at<char>(i,j)>0){
            for (int k =i; k>=0; k--) {
               dst.at<char>(k,j)=0;
            }
        }   
    }
}

但它不起作用。但它显示了分段错误(核心转储)。

3 个答案:

答案 0 :(得分:2)

应该是:

for (int j =dst.cols-1; j>=0; j--) {
for (int i =dst.rows-1; i>=0; i--) {

UPD:我认为这应该更快:

#pragma once
#include <string>
#include <iostream>
#include <vector>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
//----------------------------------------------------------
// MAIN
//----------------------------------------------------------
int main(int argc, char* argv[])
{
    // src image
    Mat src;
    // dst image
    Mat dst;
    // Image loading
    namedWindow("result");
    namedWindow("src");
    src=imread("d:\\ImagesForTest\\obstacle_scene_1_edge.jpg",0);   
    dst=Mat::zeros(src.size(),CV_8UC1);
    for (int i=0;i<src.cols;++i)
    {
        int j=src.rows-1;
        for (j=src.rows-1;j>0;--j)
        {
            if(src.at<uchar>(j,i)>0)
            {           
                break;
            }
        }
        dst(Range(j,dst.rows-1),Range(i,i+1))=255;
    }
    imshow("src",src);
    imshow("result",dst);
    //----------------------------------------------------------
    // Wait key press
    //----------------------------------------------------------
    waitKey(0);
    destroyAllWindows();
    return 0;
}

答案 1 :(得分:1)

试试这个(未经测试): (使用different testunsigned char代替char

for (int j =dst.cols-1; j>=0; j--) 
{
    bool white = true;
    for (int i =dst.rows-1; i>=0; i--) 
    {
        if (dst.at<unsigned char>(i,j) > 0)
        {
            white = false;
        }  
        if(white)
            dst.at<unsigned char>(i,j)=255;
        else
            dst.at<unsigned char>(i,j)=0;

    }
}

已修改:添加了> 0而不是== 255来检查二进制条件是否成立。

答案 2 :(得分:0)

我指的是同一篇论文/网站。但我正在使用MATLAB。

%循环功能从下到上填充图像 [rows,columns] = size(Binary Image);

表示j = 1:150; %列数    因为i = 1:100; %行数

%从(lastRow,firstColumns)

开始查找白色像素

如果 Find_white_pixel = find(二进制图像== 0,1,&#39;第一个&#39;);            new_pixel = imfill(Binary Image,i,j)== 0; %填充像素,直到看到非缺失像素

   else
       [rows, columns-1]=0;
          new_pixel=imfill (Binary Image,i++,j)==1;

端 结束 端

但是它引用我的编码的错误声明了行和列