行程宽度估计

时间:2017-05-16 16:39:20

标签: opencv image-processing

我找到了一个关于"笔画宽度估计"的算法。该算法的目的是估计将用作打开和关闭操作的内核或结构元素的大小。我试图在opencv中实现它。该算法,我采用Mou-Yen Chen的期刊和#34;离线手写单词识别使用隐马尔可夫模型类型随机网络" :

  1. 对于每列,计算黑色像素的数量以及黑色和白色之间的过渡,即运行次数
  2. 估算最大宽度 - > maxwidth =(黑色像素数/运行总数)* 1.5
  3. 丢弃运行长度大于maxwidth的黑色像素后重复步骤1
  4. 估计的宽度是黑色像素的数量除以运行次数。
  5. 这是示例图像,我已经二值化了:

    https://drive.google.com/open?id=0B_g1PNBVdIpGM1EyU0lNdHd1ZU0

    第一步,我的代码:

    int numOfBlack = 0;
    int numOfRun = 0;
    
    for(int i=0;i<thresholdImg.cols;i++){
      for(int j=0;j<thresholdImg.rows;j++){
        if(thresholdImg.at<uchar>(j,i)==0){
          numOfBlack++;
          if((j+1)<thresholdImg.rows){
            if(thresholdImg.at<uchar>(j+1,i)>0){
              numOfRun++;
            }
          }
        }
    
      }
    }
    

    第二步,我的代码:

    double maxWidth = ((numOfBlack*1.0)/(numOfRun*1.0))*1.5;
    

    第三步,我不知道怎么做,基本上我想是这样的:

    int numOfBlack2 = 0;
    int numOfRun2 = 0;
    
    for(int i=0;i<thresholdImg.cols;i++){
      int coba = 0;
      int cobaRun = 0;
      for(int j=0;j<thresholdImg.rows;j++){
        if(thresholdImg.at<uchar>(j,i)==0){
          coba++;
          if((j+1)<thresholdImg.rows){
            if(thresholdImg.at<uchar>(j+1,i)>0){
              cobaRun++;
            }
          }
        }
    
      }
    
      cout<<cobaRun<<endl;
    
      if((cobaRun*1.0<=maxWidth)){
        numOfBlack2+=coba;
        numOfRun2+=cobaRun;
      }
    }
    

    第四步:

    double strokeWitdth = ((numOfBlack2*1.0)/(numOfRun2*1.0));
    

    实际上,我在第三步中感到困惑。谁能帮我 ?因为我完全陷入了第三步。 感谢

0 个答案:

没有答案