COpenCV中的本地阈值实现

COpenCV中的本地阈值实现,第1张

概述我想实现一个本地阈值算法,我需要你的专业知识. 我的图像大小调整为600×400,灰度. 本地化的基本思维过程: >使用每个像素拍摄的9×9 ROI对图像进行分割,并计算区域中的最大强度. >创建一个9×9内核. 条件: >如果蒙版的中心像素高于最大强度的50%,则将中心像素设置为真.(应用蒙版) 我的问题是: >我应该如何选择我的内核/面具? cv::Mat ROI; cv::Mat mas 我想实现一个本地阈值算法,我需要你的专业知识.

我的图像大小调整为600×400,灰度.

本地化的基本思维过程:

>使用每个像素拍摄的9×9 ROI对图像进行分割,并计算区域中的最大强度.
>创建一个9×9内核.

条件:

>如果蒙版的中心像素高于最大强度的50%,则将中心像素设置为真.(应用蒙版)

我的问题是:

>我应该如何选择我的内核/面具?

cv::Mat ROI;  cv::Mat mask(input.size(),CV_8UC1,cv::Scalar::all(0)); // create mask of 0s at first  const int kerneldepth = 1;  const int kernelsize = 9;  cv::Mat kernel = cv::Mat::ones( kernelsize,kernelsize,CV_8UC1 );//take ROI of 9x9 and apply a thresholdfor( double x = 9; x < input.cols -9; x++ ){     for( double y = 9 ; y < input.rows - 9 ; y++ ){        try{          double x_left = x - 4;          double x_right = x + 4;          double y_up = y + 4;          double y_down = y - 4;          double maxVal;          double minVal;          cv::Point anchor(kernelsize/2,kernelsize/2);          cv::Rect ROI = cv::Rect(x_left,y_down,9,9);          cv::Mat ROI_Mat = input(ROI);                                // a new matrix for ROI          cv::Scalar avgPixelintensity = cv::mean( ROI_Mat );          // calculate mean          cv::minMaxLoc(ROI_Mat,&minVal,&maxVal);          if( input.at<uchar>(x,y) >= 0.5*maxVal){          cv::filter2D(input,mask,-1,kernel,anchor,0);    } else { break;}    }    catch (cv::Exception &e){        e.what();    }   }  *****************************UPDATED CODE: ******************************************    applyLocalThresh(cv::Mat &src,cv::Mat& out){      double maxVal,minVal;      cv::Mat output;      int top,bottom,left,right;      int borderType = cv::border_CONSTANT;      cv::Scalar value;      top = (int) (9); bottom = (int) (9);      left = (int) (9); right = (int) (9);      output = src;      out = src;      value = 0;      cv::copyMakeborder(src,output,top,right,borderType,value);     for(int y = 9; y < src.rows; y++) {        for(int x = 9; x < src.cols; x ++) {                cv::Mat ROI = src(cv::Rect(cv::Point(x-4,y-4),cv::Size(9,9)));                cv::minMaxLoc(ROI,&maxVal);        if(src.at<uchar>(cv::Point(x-4,y-4)) >= 0.6*maxVal){        out.at<uchar>(cv::Point(x-4,y-4)) = 255;    }else{        out.at<uchar>(cv::Point(x-4,y-4));        }    }} }
解决方法 你可以通过扩张然后在OpenCV中进行比较来做到这一点;

im = load image here;di = dilate im with a 9x9 kernel;bw = im > (di * 0.5); // in OpenCV,pixels of bw are set to 255 or 0

一个简单的例子用Matlab / Octave中的4×6图像和3×3内核来说明这一点:

我=

1     2     3     4     5     6 2     3     4     5     6     7 3     4     5     6     7     8 4     5     6     7     8     9

di =

3     4     5     6     7     7 4     5     6     7     8     8 5     6     7     8     9     9 5     6     7     8     9     9

th = di * .5

th =

1.5000    2.0000    2.5000    3.0000    3.5000    3.50002.0000    2.5000    3.0000    3.5000    4.0000    4.00002.5000    3.0000    3.5000    4.0000    4.5000    4.50002.5000    3.0000    3.5000    4.0000    4.5000    4.5000

bw = im>日

bw =

0     0     1     1     1     1 0     1     1     1     1     1 1     1     1     1     1     1 1     1     1     1     1     1
总结

以上是内存溢出为你收集整理的C / OpenCV中的本地阈值实现全部内容,希望文章能够帮你解决C / OpenCV中的本地阈值实现所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1216461.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存