otsu java_如何提高otsu阈值输出
我在图像上使用 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阈值输出相关推荐
- 基本的全局阈值处理Otsu方法进行最佳全局阈值处理
前言 图像阈值处理在图像分割中处于核心地位!本节将重点介绍一些常见的阈值处理方法. 一.基本的全局阈值处理 选取阈值往往是通过直方图来选择的,一方面我们可以人为的设置一个阈值进行一次二值化处理达到全局 ...
- keyshot怎么批量渲染_如何提高KeyShot的输出渲染速度
KeyShot作为单机的3D渲染和动画制作应用程序,在用来进行渲染的时候,默认其占用100%CPU.如果双倍增加内核数量,可能会减少一半的渲染时间.除了CPU内核,能够影响KeyShot输出效果的就是 ...
- 贪吃的大嘴用java_算法提高 贪吃的大嘴
试题 算法提高 贪吃的大嘴(动态规划) 问题描述 有一只特别贪吃的大嘴,她很喜欢吃一种小蛋糕,而每一个小蛋糕有一个美味度,而大嘴是很傲娇的,一定要吃美味度和刚好为m的小蛋糕,而且大嘴还特别懒,她希望通 ...
- 格子里输出 java_蓝桥杯-格子中输出-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- javascript 执行效率 java_有效提高JavaScript执行效率的几点知识
为了提供新鲜.别致的用户体验,很多网站都会使用 JavaScript 来改善设计.验证表单.检查浏览器,以及Ajax请求,cookie操作等等,实现无刷新动态效果 .但是,要将大量内容在浏览器呈现,如 ...
- ITK:使用Otsu阈值图像
ITK:使用Otsu阈值图像 内容提要 输出结果 C++实现代码 内容提要 使用Otsu方法对图像进行阈值处理. 输出结果 C++实现代码 #include "itkImageFileRea ...
- 基于OTSU(大津法)的图像分块的阈值分割
一.开发环境: Qt版本:Qt5.12.3VS版本:VS2017opencv版本:opencv-4.5.1-vc14_vc15 二.要求:实现基于图像分块+OTSU的图像分割 1.OTSU大津法实现 ...
- C++手敲基于梯度图和像素数量数组的OTSU阈值分割
一.OTSU算法原理 ➢OTSU法(最大类间方差法,有时也称之为大津算法) ➢ 使用聚类的思想,把图像的灰度数按灰度级分成2个部分, 使得两个部分之间的灰度值差异最大,每个部分之间的灰 度差异最小 ...
- OpenCV —— 阈值分割(直方图技术法,熵算法,Otsu,自适应阈值算法)
阈值分割 1. 全局阈值分割 直方图技术法 熵算法 Otsu算法 2. 局部阈值分割 自适应阈值 阈值的分割的核心就是如何选取阈值,选取正确的阈值时分割成功的关键.可以使用手动设置阈值,也可以采用直方 ...
最新文章
- 缩短网址将成微博的重要安全性问题
- [置顶] 安卓高手之路之ClassLoader(二)
- {TypeError}clamp(): argument 'min' must be Number, not Tensor
- 《linux文件权限管理大总结》RHEL6
- 两路虚拟化服务器,当四核多路服务器碰上虚拟化
- scanf(“%s“)真的只开读入字符串大小就可以了吗??
- HTML5-寻路跟踪
- Mysql主主同步详细操作过程
- Spring 阶段总结
- 程序员放弃月薪2W的工作,改行做销售,结果垫底,网友:瞎折腾
- 修复Git打包的一个Bug
- duilib绝对定位与相对定位
- 杨辉三角(Python)
- 怎么用数学绘图软件验证扇形面积公式?
- 修改win10更新后自动修改的浅绿色背景
- Explainability in Graph Neural Networks:A Taxonomic Survey 图可解释
- 复旦大学计算机科学与技术分数,2015年复旦大学计算机科学与技术考研复试分数线是320分...
- 奇怪的小鸭子也增加了Java实现
- [NCTF2019]Fake XML cookbook 1
- linux nginx连接memcache和ngx_http_consistent_hash负载均衡算法