2016-05-14 13 views
2

Я разрабатываю морфологические операции в OpenCV. Я пытаюсь имитировать функции remove и bridge в bwmorph Matlab. Для этого я ссылался на определение функции bwmorph.m, там я получил таблицы Look up table для удаления и bridge.Как использовать массив таблиц поиска элементов Matlab в OpenCV?

После этого шага процедура такая же, как для Matlab, так и для OpenCV.

 lut(img,lutarray,img) 

Проблема заключается в том, что Matlab использует 512 элемент (9bit) посмотреть схему таблицы в то время как OpenCV использует 256-элемент (8bit) посмотреть на схему, как я использую lutarray Matlab в OpenCV?

После ряда исследований я наткнулся на this post.

Что означает человек, когда говорят, что они «раскололи» изображение с 0-512, а затем на две части?

Является ли вышеуказанный метод даже правильным? Есть ли альтернативы для этого?

+0

Никто? Я думаю, что человек имел в виду, что он применял операции на первой (0-255) и второй (256-511) половинах гистограммы размером 512 бит (?), Но опять же это догадка с моей стороны, я может быть полностью отключен. Пробовал связаться с этим человеком (sonmi), но он попадает непосредственно в список рассылки @yahoogroups. Может ли кто-нибудь помочь мне с этим? Как использовать Matlab lutarray в openCV для двоичных изображений? – MyBushisaNeonJungle

+2

Пожалуйста, не отрицайте свои собственные сообщения здесь. Мы надеемся, что каждый, у кого есть хороший вопрос, получит ответ, но поскольку 99% людей здесь являются добровольцами, мы не можем этого гарантировать. – halfer

+1

'bwlookup (BW, lut)' или 'applylut' выполняет операцию фильтрации нелинейных окрестностей 2 на 2 или 3 на 3 на двоичном или полутоновом изображении BW, где как' cv :: LUT' является поиском на пиксель таблица операция. Итак, да, вы могли бы разделить изображение на выполнение последнего, но первое упоминание: 'bw = applylut (bw, lut)' в bwmorph.m не может быть реплицировано с использованием 'cv :: LUT' или другой функции OpenCV для акций. – mainactual

ответ

3

bwlookup(bw,lut)

http://se.mathworks.com/help/images/ref/bwlookup.html

или изнутри, applylut оба выполняют 2-на-2 или 3-по-3 операции окрестности на бинарном (черный & белого) изображения, в то время как OpenCV-х cv::LUT выполняет в пиксельное серое преобразование уровня (тесно связано с intlut в MATLAB). Примером последнего является гамма-коррекция на изображении уровня серого.

//! transforms array of numbers using a lookup table: dst(i)=lut(src(i)) 
CV_EXPORTS_W void LUT(InputArray src, InputArray lut, OutputArray dst, 
        int interpolation=0); 

Насколько мне известно, не существует окрестность bwlookup реализации в OpenCV. Однако, следуя описанию MATLAB's bwlookup, вы можете написать его самостоятельно.

// performs 3-by-3 lookup on binary image 
void bwlookup( 
    const cv::Mat & in, 
    cv::Mat & out, 
    const cv::Mat & lut, 
    int bordertype=cv::BORDER_CONSTANT, 
    cv::Scalar px = cv::Scalar(0)) 
{ 
    if (in.type() != CV_8UC1) 
     CV_Error(CV_StsError, "er"); 
    if (lut.type() != CV_8UC1 || lut.rows*lut.cols!=512 || !lut.isContinuous()) 
     CV_Error(CV_StsError, "lut size != 512"); 
    if (out.type() != in.type() || out.size() != in.size()) 
     out = cv::Mat(in.size(), in.type()); 

    const unsigned char * _lut = lut.data; 
    cv::Mat t; 
    cv::copyMakeBorder(in,t,1,1,1,1,bordertype,px); 
    const int rows=in.rows+1; 
    const int cols=in.cols+1; 
    for (int y=1;y<rows;++y) 
    { 
     for (int x=1;x<cols;++x) 
     { 
      int L = 0; 
      const int jmax=y+1; 
#if 0 // row-major order 
      for (int j=y-1, k=1; j<=jmax; ++j, k<<=3) 
      { 
       const unsigned char * p = t.ptr<unsigned char>(j) + x-1; 
       for (unsigned int u=0;u<3;++u) 
       { 
        if (p[u]) 
         L += (k<<u); 
#else // column-major order (MATLAB) 
      for (int j=y-1, k=1; j<=jmax; ++j, k<<=1) 
      { 
       const unsigned char * p = t.ptr<unsigned char>(j) + x-1; 
       for (unsigned int u=0;u<3;++u) 
       { 
        if (p[u]) 
         L += (k<<3*u); 
#endif 
       } 
      } 
      out.at<unsigned char>(y-1,x-1)=_lut[ L ]; 
     } 
    } 
} 

Я тестировал против remove и bridge так должно работать. Надеюсь, это поможет.

Edit: После проверки против случайной таблицы перекодировки,

lut = uint8(rand(512,1)>0.5); % @MATLAB 
B = bwlookup(A, lut); 

я перевернул порядок индексы появляются в таблице поиска (не имеет значения, если операция является симметричной).

+0

Hello @mainactual, Большое спасибо за ваш ответ. Я хотел спросить вас, как вы реализовали морфологические операции? Я просто попробовал эту штуку для lutarray для удаления на двоичном изображении, и все, что я получаю, это черный экран. – MyBushisaNeonJungle

+0

@ user6334139, вы можете умножить массив 'lut' (1 & 0) на желаемое выходное значение (обычно 0xFF), поэтому последует выход. Или, альтернативно, перетащите «out». Я думаю, что трудно уменьшить 1 с экрана. Я только что сохранил таблицу поиска MATLAB в png и импортировал ее таким образом. – mainactual

+0

Хорошо, это работает! Проверит его еще несколькими морфологическими операциями и сообщит вам об этом. Между тем, можете ли вы рассказать мне свою интерпретацию кода? Что там происходит? – MyBushisaNeonJungle

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

  • Нет связанных вопросов^_^