Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 笔划宽度估计_Opencv_Image Processing - Fatal编程技术网

Opencv 笔划宽度估计

Opencv 笔划宽度估计,opencv,image-processing,Opencv,Image Processing,我找到了一个关于“笔划宽度估计”的算法。该算法的目的是估计将用作打开和关闭操作的核心或结构元素的大小。我尝试在opencv中实现它。该算法摘自Mou Yen Chen的期刊《使用隐马尔可夫模型类型随机网络的脱机手写字识别》: 对于每列,计算黑色像素的数量以及黑白之间的转换,即运行的数量 通过-->maxwidth=(黑色像素数/运行总数)*1.5估算maxwidth 丢弃运行长度大于maxwidth的黑色像素后,重复步骤1 估计宽度是黑色像素数除以运行数 这是示例图像,我已经进行了二值化: 对

我找到了一个关于“笔划宽度估计”的算法。该算法的目的是估计将用作打开和关闭操作的核心或结构元素的大小。我尝试在opencv中实现它。该算法摘自Mou Yen Chen的期刊《使用隐马尔可夫模型类型随机网络的脱机手写字识别》:

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

    对于第一步,我的代码是:

    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;
      }
    }
    
    事实上,我在第三步搞混了。有人能帮我吗?因为我完全陷入了第三步。
    谢谢

    您可以编辑您的问题以包含示例图像吗?笔划是水平的吗?还是垂直的?还有一个指向算法的链接,以及你实际想做什么的描述?@barny我已经编辑了我的问题,还有一个示例图像。
    double strokeWitdth = ((numOfBlack2*1.0)/(numOfRun2*1.0));