我在图像上使用 otsu threshold .

这是输入图像:

这是输出:

这是我正在使用的代码:

#include "opencv2/imgproc/imgproc.hpp"

#include "opencv2/highgui/highgui.hpp"

#include

#include

#include

#include

#include

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;

}

问题是输出在底部和左侧有一个黑色区域 . 我该怎么做才能最小化/删除它?

编辑:

我试过 equalizeHist() ,我得到了这个:

将尝试将图像分解成碎片并单独处理它们 .

对不起这是我的错 . 前一个是使用自适应过滤 . 使用 Otsu 我得到这个:

otsu的输出没有变化:/

编辑2:完成了Feng Tan算法,它提供了更好的结果,但是文本没有清晰度 .

码:

#include "opencv2/imgproc/imgproc.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/photo/photo.hpp"

#include

#include

#include

#include

#include

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(r, c);

}

}

s_mean = s_mean / static_cast (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 (r, c) - s_mean;

s_stdDev += diff * diff;

}

}

s_stdDev = sqrt(s_stdDev / static_cast (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 (c, r);

if(lROI_gray.at (r, c) < l_min) {

l_min = lROI_gray.at (r, c);

}

}

}

l_mean = l_mean / static_cast (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 (r, c) - l_mean;

l_stdDev += diff * diff;

}

}

l_stdDev = sqrt(l_stdDev / static_cast (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(r, c);

if(pixel_val >= threshold) {

img_c_bin.at (r, c) = 255;

} else {

img_c_bin.at (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;

}

输出:

otsu java_如何提高otsu阈值输出相关推荐

  1. 基本的全局阈值处理Otsu方法进行最佳全局阈值处理

    前言 图像阈值处理在图像分割中处于核心地位!本节将重点介绍一些常见的阈值处理方法. 一.基本的全局阈值处理 选取阈值往往是通过直方图来选择的,一方面我们可以人为的设置一个阈值进行一次二值化处理达到全局 ...

  2. keyshot怎么批量渲染_如何提高KeyShot的输出渲染速度

    KeyShot作为单机的3D渲染和动画制作应用程序,在用来进行渲染的时候,默认其占用100%CPU.如果双倍增加内核数量,可能会减少一半的渲染时间.除了CPU内核,能够影响KeyShot输出效果的就是 ...

  3. 贪吃的大嘴用java_算法提高 贪吃的大嘴

    试题 算法提高 贪吃的大嘴(动态规划) 问题描述 有一只特别贪吃的大嘴,她很喜欢吃一种小蛋糕,而每一个小蛋糕有一个美味度,而大嘴是很傲娇的,一定要吃美味度和刚好为m的小蛋糕,而且大嘴还特别懒,她希望通 ...

  4. 格子里输出 java_蓝桥杯-格子中输出-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  5. javascript 执行效率 java_有效提高JavaScript执行效率的几点知识

    为了提供新鲜.别致的用户体验,很多网站都会使用 JavaScript 来改善设计.验证表单.检查浏览器,以及Ajax请求,cookie操作等等,实现无刷新动态效果 .但是,要将大量内容在浏览器呈现,如 ...

  6. ITK:使用Otsu阈值图像

    ITK:使用Otsu阈值图像 内容提要 输出结果 C++实现代码 内容提要 使用Otsu方法对图像进行阈值处理. 输出结果 C++实现代码 #include "itkImageFileRea ...

  7. 基于OTSU(大津法)的图像分块的阈值分割

    一.开发环境: Qt版本:Qt5.12.3VS版本:VS2017opencv版本:opencv-4.5.1-vc14_vc15 二.要求:实现基于图像分块+OTSU的图像分割 1.OTSU大津法实现 ...

  8. C++手敲基于梯度图和像素数量数组的OTSU阈值分割

     一.OTSU算法原理 ➢OTSU法(最大类间方差法,有时也称之为大津算法) ➢ 使用聚类的思想,把图像的灰度数按灰度级分成2个部分, 使得两个部分之间的灰度值差异最大,每个部分之间的灰 度差异最小 ...

  9. OpenCV —— 阈值分割(直方图技术法,熵算法,Otsu,自适应阈值算法)

    阈值分割 1. 全局阈值分割 直方图技术法 熵算法 Otsu算法 2. 局部阈值分割 自适应阈值 阈值的分割的核心就是如何选取阈值,选取正确的阈值时分割成功的关键.可以使用手动设置阈值,也可以采用直方 ...

最新文章

  1. 缩短网址将成微博的重要安全性问题
  2. [置顶] 安卓高手之路之ClassLoader(二)
  3. {TypeError}clamp(): argument 'min' must be Number, not Tensor
  4. 《linux文件权限管理大总结》RHEL6
  5. 两路虚拟化服务器,当四核多路服务器碰上虚拟化
  6. scanf(“%s“)真的只开读入字符串大小就可以了吗??
  7. HTML5-寻路跟踪
  8. Mysql主主同步详细操作过程
  9. Spring 阶段总结
  10. 程序员放弃月薪2W的工作,改行做销售,结果垫底,网友:瞎折腾
  11. 修复Git打包的一个Bug
  12. duilib绝对定位与相对定位
  13. 杨辉三角(Python)
  14. 怎么用数学绘图软件验证扇形面积公式?
  15. 修改win10更新后自动修改的浅绿色背景
  16. Explainability in Graph Neural Networks:A Taxonomic Survey 图可解释
  17. 复旦大学计算机科学与技术分数,2015年复旦大学计算机科学与技术考研复试分数线是320分...
  18. 奇怪的小鸭子也增加了Java实现
  19. [NCTF2019]Fake XML cookbook 1
  20. linux nginx连接memcache和ngx_http_consistent_hash负载均衡算法

热门文章

  1. AutoCAD 2012开发环境配置
  2. python语言保留字可以用变量名来命名_Python语言基本语法元素之变量,变量的含义及命名规则...
  3. 哪个浏览器支持php,浏览器内核有哪些
  4. 学习编程可能会走哪些弯路,有哪些经验可以参考?
  5. 儿童节,送你一批值得关注的公众号!
  6. python实现MACD python趋势策略 策略开发
  7. Github注册问题解决方案
  8. html5什么是动态页面,举例说明什么是动态网站、静态网站
  9. Google用机器学习把各种鸟叫整合成一张互动图,而且开源了代码
  10. OA系统选型建议考虑这5大维度