Implementación de la longitud del algoritmo de suavizado en C ++

Soy nuevo con C ++ y OpenCV.

Me encontré con un artículo interesante:

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

Hay implementación de RLSA en Matlab por este hilo:

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

En el enlace de arriba: Matlab Code Vector Version por Bruno Luong

% 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 [mn] = 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) 

Versión normal por Yumnam Kirani Singh

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

Cualquiera que tenga experiencia en C ++ podría implementarlo con OpenCV, C ++ usando Mat Structure ??

Editado

 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(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; } } } } 

Esta vez no se produce ningún error pero no se espera el resultado.

El problema es la forma en que quiero escribir código c ++ de la misma manera que

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)); 

¿¿¿Alguna idea???

Otra cosa es que en Matlab el índice comienza desde 1, mientras que C ++ comienza desde 0.

Gracias

Finalmente implemento este algoritmo, espero que pueda ayudar a quienes lo necesiten.

  int hor_thres = 22; int zero_count = 0; int one_flag = 0; for (int i = 0; i(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; } } } } 

La sugerencia futura es mejorar esta implementación sin usar bucle.