2014-02-04 4 views
-1

Я новичок в C++ и OpenCV.Алгоритм сглаживания реализации выполнения в C++

я наткнулся на интересную статью:

http://crblpocr.blogspot.fr/2007/06/run-length-smoothing-algorithm-rlsa.html http://crblpocr.blogspot.fr/2007/06/determination-of-run-length-smoothing.html

Существует поисковой сети реализации в Matlab по этой теме:

http://mathworks.cn/matlabcentral/newsreader/view_thread/318198

В ссылке выше: Matlab кодекса Векторная версия Бруно Луона G

% Data 
x=[0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0; 
    0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0] 
C = 4; 
% Engine 
[m n] = size(x); 
xx = [ones(m,1) x ones(m,1)]; 
xx = reshape(xx',1,[]); 
d = diff(xx); 
start = find(d==-1); 
stop = find(d==1); 
lgt = stop-start; 
b = lgt <= C; 
d(start(b)) = 0; 
d(stop(b)) = 0; 
yy = cumsum([1 d]); 
yy = reshape(yy, [], m)'; 
y = yy(:,2:end-1) 

Обычная версия по Yumnam Kirani Сингх

clear;clc; 
x=imread('Picture.jpg'); 
y=rgb2gray(x) ; 
z=histeq(y); 
t=im2bw(z); 
u=double(t); 
[a b]=size(u); 
for i=1:a 
    c=1; 
for j=1:b 
    if u(i,j)==1 
if (j-c)<=5 
    u(i,c:j)=1; 
end 
c=j; 
end 
end 
if (b-c)<=5 
    u(i,c:b)=1; 
    end 
    end 
imshow(u,[]); 

Каждый имеет опыт в C++ может реализовать его с OpenCV, C++ с использованием Mat структуры ??

EDITED

int hor_thres = 22; 
int one_count = 0; 
int zero_flag = 0; 
Mat tmpImg = Mat(Img.size(), CV_8UC1, Scalar(0, 0, 0)); 
for (int j = 0; j<Img.rows; j++){ 
    for (int i = 0; i<Img.cols; j++){ 
     if (Img.at<uchar>(j, i) == 0) 
     { 
      if (zero_flag == 1) 
      { 
       if (one_count <= hor_thres) 
       {   
        tmpText(cv::Range(j - zero_count, j), cv::Range(i, i+1)).setTo(cv::Scalar::all(255)); 
        // I want to do the same thing in Matlab as this image(i,j-one_count:j-1)=0; 
       } 
       else 
       { 
        zero_flag = 1; 
       } 
       one_count = 0; 
      } 
      zero_flag = 1; 
     } 
     else 
     { 
      if (zero_flag == 1) 
      { 
       one_count = one_count + 1; 
      } 
     } 
    } 
} 

На этот раз нет ошибки, но результат не ожидается ..

Вопрос в том, как я хочу, чтобы написать C++ код то же самое, как

Matlab

tmpImg(i,j-one_count:j-1)=0; 

C++

tmpText(cv::Range(j - zero_count, j), cv::Range(i, i+1)).setTo(cv::Scalar::all(255)); 

Anyidea ???

Другое дело в Matlab начало индекса от 1, а C++ начинаются с 0.

Thank

ответ

1

я, наконец, реализовать этот алгоритм, надеюсь, что это может помочь тем, кто нуждается в ней.

   int hor_thres = 22; 
       int zero_count = 0; 
       int one_flag = 0; 
       for (int i = 0; i<tmpImg.rows; i++){ 
        for (int j = 0; j<tmpImg.cols; j++){ 
         if (tmpImg.at<uchar>(i, j) == 255) 
         { 
          if (one_flag == 255) 
          { 
           if (zero_count <= hor_thres) 
           { 


            tmpImg(cv::Range(i, i + 1), cv::Range(j - zero_count, j)).setTo(cv::Scalar::all(255)); 
                } 
           else 
           { 
            one_flag = 0; 
           } 
           zero_count = 0; 
          } 
          one_flag = 255; 
         } 
         else 
         { 
          if (one_flag == 255) 
          { 
           zero_count = zero_count + 1; 
          } 
         } 
        } 
       } 

будущее предложение улучшить эту реализацию без использования цикла.

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