Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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
C++ 如何提高大津阈值输出_C++_Opencv - Fatal编程技术网

C++ 如何提高大津阈值输出

C++ 如何提高大津阈值输出,c++,opencv,C++,Opencv,我正在图像上使用大津阈值。 以下是输入图像: 以下是输出: 以下是我正在使用的代码: #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <stdlib.h> #include <stdio.h> #include <iostream> #include <string> #include <math.h> u

我正在图像上使用大津阈值。
以下是输入图像:


以下是输出:

以下是我正在使用的代码:

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
#include <math.h>

using namespace std;
using namespace cv;

int main(int argc, char const *argv[]) {
  title("Text Extractor");
  string win_name = "textextractor";
  Mat img_a;

  img_a = imread("../input/test_c.jpg");

  Mat img_a_gray;
  cvtColor(img_a, img_a_gray, CV_BGR2GRAY);

  Mat img_a_blur;    
  GaussianBlur(img_a_gray, img_a_blur, Size(3, 3), 0, 0);

  Mat img_a_thres;
  // adaptiveThreshold(img_a_blur, img_a_thres, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 5, 4);
  threshold(img_a_blur, img_a_thres, 0, 255, THRESH_OTSU);
  namedWindow(win_name + "_a", CV_WINDOW_AUTOSIZE);
  imshow(win_name + "_a", img_a_thres);

  imwrite("../output/output_a.jpg", img_a_thres);

  waitKey(0);
  return 0;
}
输出:


这是我在试运行后得到的。最初,我对原始图像进行了中值模糊处理。然后我对模糊图像应用了自适应阈值

这就是我得到的:

1。使用高斯滤波器的自适应阈值:

2。使用均值滤波器的自适应阈值:

从这里开始,您可以执行一系列最适合最终图像的形态学操作。:)

您应该尝试使用

我在MATLAB上使用了:

结果:

注意:您可以在此图像上应用阈值。大津现在应该可以用了


尝试自适应阈值:我被要求尝试使大津的输出尽可能好。正如你们在评论中可能看到的,我已经试过了。更好,但我仍然需要使用otsu:/Try
cv2.eqHist()
,然后再将图像传递给otsu。我认为在这种情况下,将图像分割为大小相等的单个像素簇可以产生更好的结果,分别调用每个otsu。尝试使用
cv2.medianBlur()模糊图像
在尝试上述步骤之前,这些都是非常好的结果:)我尝试了去噪,但这并没有对图像产生太大影响。但我也复制了你们现在的成果<代码>大津仍无法运行。我正在尝试检查算法和调整的东西。这是有趣的:)看看技术以及。不过,您必须自己编写代码:)
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/photo/photo.hpp"
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
#include <math.h>

using namespace std;
using namespace cv;

int main(int argc, char const *argv[]) {
  string win_name = "textextractor";

  Mat img_c;
  img_c = imread("../input/sample.jpg");

  Mat img_c_gray;
  cvtColor(img_c, img_c_gray, CV_BGR2GRAY);

  Mat img_c_bin = Mat::zeros(img_c_gray.rows, img_c_gray.cols, CV_8UC1);

  int s_win = 17;
  int l_win = 35;

  double min_tau = 10;

  Rect roi_s = Rect(-s_win/2, -s_win/2, s_win, s_win);
  Rect roi_l = Rect(-l_win/2, -l_win/2, l_win, l_win);
  Rect img_c_roi = Rect(0, 0, img_c_gray.cols, img_c_gray.rows);

  for (size_t r = 0; r < img_c_gray.rows; r++) {
    for (size_t c = 0; c < img_c_gray.cols; c++) {
      double pthres = 255;

      Rect sROI = roi_s + Point(c, r);
      sROI = sROI & img_c_roi;
      if(sROI.width == 0 || sROI.height == 0) {
        continue;
      }

      Rect lROI = roi_l + Point(c, r);
      lROI = lROI & img_c_roi;
      if(lROI.width == 0 || lROI.height == 0) {
        continue;
      }

      Mat sROI_gray = img_c_gray(sROI);
      Mat lROI_gray = img_c_gray(lROI);

      double s_stdDev = 0;
      double l_stdDev = 0;
      double s_mean = 0;
      double l_mean = 0;
      double l_min = DBL_MAX;

      for (size_t r = 0; r < sROI_gray.rows; r++) {
        for (size_t c = 0; c < sROI_gray.cols; c++) {
          s_mean += sROI_gray.at<unsigned char>(r, c);
        }
      }

      s_mean = s_mean / static_cast<double> (sROI_gray.cols * sROI_gray.rows);

      for (size_t r = 0; r < sROI_gray.rows; r++) {
        for (size_t c = 0; c < sROI_gray.cols; c++) {
          double diff = sROI_gray.at<unsigned char> (r, c) - s_mean;
          s_stdDev += diff * diff;
        }
      }

      s_stdDev = sqrt(s_stdDev / static_cast<int> (sROI_gray.cols * sROI_gray.rows));

      for (size_t r = 0; r < lROI_gray.rows; r++) {
        for (size_t c = 0; c < lROI_gray.cols; c++) {
          l_mean += lROI_gray.at<unsigned char> (c, r);

          if(lROI_gray.at<unsigned char> (r, c) < l_min) {
            l_min = lROI_gray.at<unsigned char> (r, c);
          }
        }
      }
      l_mean = l_mean / static_cast<double> (lROI_gray.cols * lROI_gray.rows);

      for (size_t r = 0; r < lROI_gray.rows; r++) {
        for (size_t c = 0; c < lROI_gray.cols; c++) {
          double diff = lROI_gray.at<unsigned char> (r, c) - l_mean;
          l_stdDev += diff * diff;
        }
      }
      l_stdDev = sqrt(l_stdDev / static_cast<double> (lROI_gray.cols * lROI_gray.rows));

      double tau = ((s_mean - l_min) * (1 - s_stdDev / l_stdDev)) / 2.0;
      if(tau < min_tau) {
        tau = min_tau;
      }

      double threshold = s_mean - tau;

      unsigned char pixel_val = img_c_gray.at<unsigned char>(r, c);
      if(pixel_val >= threshold) {
        img_c_bin.at<unsigned char> (r, c) = 255;
      } else {
        img_c_bin.at<unsigned char> (r, c) = 0;
      }
    }
  }

  namedWindow(win_name + "_c", CV_WINDOW_AUTOSIZE);
  imshow(win_name + "_c", img_c_bin);

  imwrite("../output/output_c.jpg", img_c_bin);
  waitKey(0);
  return 0;
}
Ia = imread('FHXTJ.jpg');
I = rgb2gray(Ia);
A = adapthisteq(I, 'clipLimit', 0.02, 'Distribution', 'rayleigh');