2014-02-06 3 views
0

У меня есть двоичное изображение. , и я хочу заполнить часть его раздела полностью черным и оставшимся белым. , что я хочу, можно лучше всего объяснить здесь. http://www.roborealm.com/tutorial/Obstacle_Avoidance/slide020.php объяснение-я начинаю с нижнего правого и идем влево влево. Если я найду какой-либо нечерный пиксель, все пиксели, имеющие координату Y меньше, чем он, и имеющие ту же координату X, станут черными. Это работает, начиная с нижней части изображения и продолжая вертикально пиксельно по пикселям, заполняя каждый пустой черный пиксель, -черный пиксель. Затем заполнение останавливает вертикальный столбец и переходит к следующему.Как заполнить часть бинарного изображения в opencv?

Я написал для этого код в 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; 
      } 
     } 
    } 
} 

но его не работает. Но оно показало неисправность сегментации (сброс ядра).

ответ

1

попробовать это (не проверено): (используется different test и unsigned 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, чтобы проверить, выполняется ли двоичное условие.

+0

Thankyou так много. Могу я узнать, где я был неправ? Спасибо. – Shubham

+0

Это сработало. Спасибо. – Shubham

+0

Я вижу две возможные проблемы: 1. тестирование против 'char' вместо' unsigned char', вы не найдете значения '255' и 2. вам нужно установить значение' i = 0; 'после того, как вы найдете' > 0', иначе внутренний цикл 'for' снова перезапишет ваши результаты. – Micka

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; 
} 
+0

дайте мне попробовать, спасибо. – Shubham

+0

снова показывает полностью белое изображение. – Shubham

+0

Подождите пару минут, я проверю код. –

0

Я ссылаюсь на ту же самую бумагу/сайт. Но я использую MATLAB.

% Функция Loop для заполнения изображения снизу вверх [rows, columns] = size (Binary Image);

для j = 1: 150; % количество столбцов для i = 1: 100; % Количество строк

% Найти белые пиксели, начиная с (lastRow, firstColumns)

если Find_white_pixel = находка (бинарное изображение == 0,1, 'первого'); new_pixel = imfill (двоичное изображение, i, j) == 0; % Заполнение пикселей до тех пор, не отсутствие пиксели не виден

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

КОНЦА торцевой конца

Но его ошибка в виде мое кодирования для объявить строку и столбец

+0

Если у вас есть новый вопрос, пожалуйста, спросите его, нажав кнопку [Ask Question] (http://stackoverflow.com/questions/ask); вы можете включить ссылку на эту ссылку для контекста.Или вы можете задать этот вопрос как фаворит, чтобы получать уведомления о новых ответах. После того, как у вас будет достаточная репутация, вы можете также увеличить (http://stackoverflow.com/privileges/vote-up) или [добавить щедрость] (http://stackoverflow.com/privileges/set-bounties) привлечь больше внимания. –

Смежные вопросы