- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 OpenCV 的 cv::threshold
函数(更具体 THRESH_OTSU
),只是我想用蒙版(任何形状)来做,以便在计算过程中忽略外部(背景)。
图像是单 channel (必须是),下面的红色仅用于在图像上标记示例多边形。
我尝试使用 adaptiveThreshold
,但有几个问题使它不适合我的情况。
最佳答案
通常,您可以使用 cv::threshold
简单地计算阈值。 ,然后复制 src
图片上 dst
使用倒置的 mask
.
// Apply cv::threshold on all image
thresh = cv::threshold(src, dst, thresh, maxval, type);
// Copy original image on inverted mask
src.copyTo(dst, ~mask);
THRESH_OTSU
,但是,您还需要仅在蒙版图像上计算阈值。以下代码是
static double getThreshVal_Otsu_8u(const Mat& _src)
的修改版本在
thresh.cpp
:
double otsu_8u_with_mask(const Mat1b src, const Mat1b& mask)
{
const int N = 256;
int M = 0;
int i, j, h[N] = { 0 };
for (i = 0; i < src.rows; i++)
{
const uchar* psrc = src.ptr(i);
const uchar* pmask = mask.ptr(i);
for (j = 0; j < src.cols; j++)
{
if (pmask[j])
{
h[psrc[j]]++;
++M;
}
}
}
double mu = 0, scale = 1. / (M);
for (i = 0; i < N; i++)
mu += i*(double)h[i];
mu *= scale;
double mu1 = 0, q1 = 0;
double max_sigma = 0, max_val = 0;
for (i = 0; i < N; i++)
{
double p_i, q2, mu2, sigma;
p_i = h[i] * scale;
mu1 *= q1;
q1 += p_i;
q2 = 1. - q1;
if (std::min(q1, q2) < FLT_EPSILON || std::max(q1, q2) > 1. - FLT_EPSILON)
continue;
mu1 = (mu1 + i*p_i) / q1;
mu2 = (mu - q1*mu1) / q2;
sigma = q1*q2*(mu1 - mu2)*(mu1 - mu2);
if (sigma > max_sigma)
{
max_sigma = sigma;
max_val = i;
}
}
return max_val;
}
threshold_with_mask
,为您包装所有不同的案例。如果没有 mask ,或者 mask 是全白的,那么使用
cv::threshold
.否则,请使用上述方法之一。请注意,此包装器仅适用于
CV_8UC1
图片(为简单起见,如果需要,您可以轻松地将其扩展为与其他类型一起使用),并接受所有
THRESH_XXX
原始组合
cv::threshold
.
double threshold_with_mask(Mat1b& src, Mat1b& dst, double thresh, double maxval, int type, const Mat1b& mask = Mat1b())
{
if (mask.empty() || (mask.rows == src.rows && mask.cols == src.cols && countNonZero(mask) == src.rows * src.cols))
{
// If empty mask, or all-white mask, use cv::threshold
thresh = cv::threshold(src, dst, thresh, maxval, type);
}
else
{
// Use mask
bool use_otsu = (type & THRESH_OTSU) != 0;
if (use_otsu)
{
// If OTSU, get thresh value on mask only
thresh = otsu_8u_with_mask(src, mask);
// Remove THRESH_OTSU from type
type &= THRESH_MASK;
}
// Apply cv::threshold on all image
thresh = cv::threshold(src, dst, thresh, maxval, type);
// Copy original image on inverted mask
src.copyTo(dst, ~mask);
}
return thresh;
}
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
// Modified from thresh.cpp
// static double getThreshVal_Otsu_8u(const Mat& _src)
double otsu_8u_with_mask(const Mat1b src, const Mat1b& mask)
{
const int N = 256;
int M = 0;
int i, j, h[N] = { 0 };
for (i = 0; i < src.rows; i++)
{
const uchar* psrc = src.ptr(i);
const uchar* pmask = mask.ptr(i);
for (j = 0; j < src.cols; j++)
{
if (pmask[j])
{
h[psrc[j]]++;
++M;
}
}
}
double mu = 0, scale = 1. / (M);
for (i = 0; i < N; i++)
mu += i*(double)h[i];
mu *= scale;
double mu1 = 0, q1 = 0;
double max_sigma = 0, max_val = 0;
for (i = 0; i < N; i++)
{
double p_i, q2, mu2, sigma;
p_i = h[i] * scale;
mu1 *= q1;
q1 += p_i;
q2 = 1. - q1;
if (std::min(q1, q2) < FLT_EPSILON || std::max(q1, q2) > 1. - FLT_EPSILON)
continue;
mu1 = (mu1 + i*p_i) / q1;
mu2 = (mu - q1*mu1) / q2;
sigma = q1*q2*(mu1 - mu2)*(mu1 - mu2);
if (sigma > max_sigma)
{
max_sigma = sigma;
max_val = i;
}
}
return max_val;
}
double threshold_with_mask(Mat1b& src, Mat1b& dst, double thresh, double maxval, int type, const Mat1b& mask = Mat1b())
{
if (mask.empty() || (mask.rows == src.rows && mask.cols == src.cols && countNonZero(mask) == src.rows * src.cols))
{
// If empty mask, or all-white mask, use cv::threshold
thresh = cv::threshold(src, dst, thresh, maxval, type);
}
else
{
// Use mask
bool use_otsu = (type & THRESH_OTSU) != 0;
if (use_otsu)
{
// If OTSU, get thresh value on mask only
thresh = otsu_8u_with_mask(src, mask);
// Remove THRESH_OTSU from type
type &= THRESH_MASK;
}
// Apply cv::threshold on all image
thresh = cv::threshold(src, dst, thresh, maxval, type);
// Copy original image on inverted mask
src.copyTo(dst, ~mask);
}
return thresh;
}
int main()
{
// Load an image
Mat1b img = imread("D:\\SO\\img\\nice.jpg", IMREAD_GRAYSCALE);
// Apply OpenCV version
Mat1b cvth;
double cvth_value = threshold(img, cvth, 100, 255, THRESH_OTSU);
// Create a binary mask
Mat1b mask(img.rows, img.cols, uchar(0));
rectangle(mask, Rect(100, 100, 200, 200), Scalar(255), CV_FILLED);
// Apply threshold with a mask
Mat1b th;
double th_value = threshold_with_mask(img, th, 100, 255, THRESH_OTSU, mask);
// Show results
imshow("cv::threshod", cvth);
imshow("threshold_with_balue", th);
waitKey();
return 0;
}
关于c++ - 带掩码的 OpenCV 阈值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42433691/
我正在用 R 编写程序。我卡在这里。 我有像这样的矢量 X=c(84.05, 108.04, 13.95, -194.05, 64.03, 208.05, 84.13, 57.04) 我想在用 180
我正在编写一个应用程序,该应用程序涉及使用手指或手写笔在屏幕上书写。我有那部分工作。在 ACTION_DOWN 上,开始绘制;在 ACTION_MOVE 上,添加线段;在 ACTION_UP 上,完成
我正在尝试构建 OCR 以从图像中提取文本,我正在使用轮廓来形成文本字符的边界, 经过几次更改 cv2.threshold 的试验后,我在形成文本字符的边界时得到了最适合的轮廓。 #files = o
我正在尝试使用 OpenCV 的 cv::threshold函数(更具体 THRESH_OTSU ),只是我想用蒙版(任何形状)来做,以便在计算过程中忽略外部(背景)。 图像是单 channel (必
对于学校项目,我试图用 Python 编写一个程序来跟踪学生的运动。为了做到这一点,我正在使用 OpenCV。 在互联网上查找了一些教程后,我注意到几乎每个人都使用阈值来实现这一点,因为几乎每一步都需
我使用 jest 来驱动 selenium 测试,它报告一个需要 12 秒的测试缓慢(持续时间以红色突出显示)。在这种情况下,12 秒就可以了。 如何将阈值配置为 30 秒? 最佳答案 Jest is
我想找到 list1 中与 list2 中的值足够接近的值(基于指定的阈值),即与下面的代码类似的功能。然而,与 pyhton 的 set 交集相比,下面的 intersect_with_thresh
我正在尝试创建一张图表上有两个系列并带有阈值选项的浮线图。我知道当我只有 1 个系列时如何启用阈值(就像这里 http://people.iola.dk/olau/flot/examples/thre
我已正确应用 d3 (v 4.0) 直方图函数对数据数组进行分箱。我的代码如下所示: var bins = d3.histogram() .domain([data_points_min,
我正在使用带有自然语言全文的 Mysql FULLTEXT 搜索,不幸的是,我遇到了 FULLTEXT 50% 阈值,如果给定的关键字出现在总行数的 50% 时间,则不允许我搜索行。 我搜索并找到了一
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
这是我的绘图数据 var data = [{ data: [[4, 80], [8, 50], [9, 130]], color: "r
是否可以制作Canny忽略短边还是忽略低梯度边?在我的例子中,我将卡片放在木头上,并在 canny 之后看到木结构的许多边缘 canny 函数中的两个阈值有什么用? 最佳答案 Large intens
我正在尝试使用 OpenCV 的 cv::threshold 函数(更具体的 THRESH_OTSU),只是我想使用掩码(任何形状) ), 以便在计算过程中忽略外部(背景)。 图像是单 channel
我正在寻找根据提供的音频、频率范围(例如 20hz-1000hz)和阈值缩放 PNG 文件,以获得平滑的效果。 例如,当有脚踢时,比例平滑到 120%,我想让那些音频可视化器,如 dubstep 等.
我正在尝试找到最佳阈值,以使我的逻辑回归具有最高的 f1 分数。但是,当我写下以下几行时: val f1Score = metrics.fMeasureByThreshold f1Score.fore
我使用 Flot 创建了一个实时(每 10 毫秒更新一次)垂直样条图。图表可见here on Codepen 。我包括了 Flot multiple threshold plugin ,但我希望阈值使
我有一个数据框,其中包含从第 1 天到第 7 天的三个人(John、Terry、Henry)的分数。 1 2 3 4 5 6 7
我正在尝试实现多级 Otsu 阈值,更具体地说,我需要 3 个阈值/4 个类。 我知道关于 SO 的 2 个类似问题:#34856019 和 #22706742。问题是我没有得到好的结果:我已经阅读了
The documentation在 THRESH_BINARY 上说: dst(x,y) = maxval if src(x,y) > thresh else 0 这对我来说并不意味着这不适用于彩色
我是一名优秀的程序员,十分优秀!