gpt4 book ai didi

c++ - C++/OpenCV 中的局部阈值实现

转载 作者:太空狗 更新时间:2023-10-29 20:12:24 25 4
gpt4 key购买 nike

我想实现一个本地阈值算法,我需要你的专业知识。

我的图像已调整为 600x400,灰度。

本地化的基本思路:

  • 使用在每个像素处获取的 9x9 ROI 分割图像并计算该区域的最大强度。
  • 创建一个 9x9 内核。

    条件:

    • 如果 mask 的中心像素高于最大强度的 50%,则将中心像素设置为真。(应用 mask )

我的问题:

  • 我应该如何选择我的内核/掩码?

      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 threshold

    for( 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,bottom,left,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,&minVal,&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 中使用 4x6 图像和 3x3 内核来说明这一点的简单示例:

我=

 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

第 =

1.5000    2.0000    2.5000    3.0000    3.5000    3.5000
2.0000 2.5000 3.0000 3.5000 4.0000 4.0000
2.5000 3.0000 3.5000 4.0000 4.5000 4.5000
2.5000 3.0000 3.5000 4.0000 4.5000 4.5000

bw = im > th

体重=

 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++ - C++/OpenCV 中的局部阈值实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27948473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com