计算平均值:蒙版图像与投资回报率的不同结果
Calculate Mean: different result for masked image vs ROI
>我有一个奇怪的问题,如果我使用蒙版而不是创建一个具有小投资回报率的新垫子,我的平均梯度幅度结果会有所不同。我将解释我这样做的 2 种不同方法以及我得到的 2 种不同的平均梯度幅度结果。我想我应该得到相同的平均梯度幅度结果?
场景:图像 A 是我的风景源/原始图像。我想获得区域 A
(10,100), (100,100), (100,150), (10,150)
的平均梯度幅度。
技术 1:
- 创建一个仅显示区域 A 的 ROIMat
。所以它的尺寸是由50
90
的.
- 执行cv::Sobel()
,cv::magnitude()
然后cv::meanStdDev()
- 我的平均梯度幅度结果是11.34
。
技术 2:
- 创建一个作为掩码的新Mat
。垫子的尺寸与图像 A 相同,并且在区域 A 所在的位置上有一个白色区域。然后创建一个新的垫子,只显示图像 A 的该区域和垫子的其余部分是黑色的 - 希望这是有意义的。
- 执行cv::Sobel()
,cv::magnitude()
(但使用蒙版(,然后cv::meanStdDev()
- 我的平均梯度幅度结果是43.76
。
为什么结果不同?
下面是我的代码:
static Mat backupSrc;
static Mat curSrc;
// Technique 1
void inspectRegion(const Point& strt, const Point& end) {
curSrc = Mat(backupSrc.size(), CV_8UC3);
cvtColor(backupSrc, curSrc, CV_GRAY2RGB);
Rect region = Rect(strt, end);
Mat regionImg = Mat(curSrc, region);
// Calculate the average gradient magnitude/strength across the image
Mat dX, dY, mag;
Sobel(regionImg, dX, CV_32F, 1, 0);
Sobel(regionImg, dY, CV_32F, 0, 1);
magnitude(dX, dY, mag);
Scalar sMMean, sMStdDev;
meanStdDev(mag, sMMean, sMStdDev);
double magnitudeMean = sMMean[0];
double magnitudeStdDev = sMStdDev[0];
rectangle(curSrc, region, { 0 }, 1);
printf("[Gradient Magnitude Mean: %.3f, Gradient Magnitude Std Dev: %.3f]n", magnitudeMean, magnitudeStdDev);
}
// Technique 2
void inspectRegion(const std::vector<Point>& pnts) {
curSrc = Mat(backupSrc.size(), CV_8UC3);
cvtColor(backupSrc, curSrc, CV_GRAY2RGB);
std::vector<std::vector<Point>> cPnts;
cPnts.push_back(pnts);
Mat mask = Mat::zeros(curSrc.rows, curSrc.cols, CV_8UC1);
fillPoly(mask, cPnts, { 255 });
Mat regionImg;
curSrc.copyTo(regionImg, mask);
// Calculate the average gradient magnitude/strength across the image
Mat dX, dY, mag;
Sobel(regionImg, dX, CV_32F, 1, 0);
Sobel(regionImg, dY, CV_32F, 0, 1);
magnitude(dX, dY, mag);
Scalar sMMean, sMStdDev;
meanStdDev(mag, sMMean, sMStdDev, mask);
double magnitudeMean = sMMean[0];
double magnitudeStdDev = sMStdDev[0];
polylines(curSrc, pnts, true, { 255 }, 3);
printf("[Gradient Magnitude Mean: %.3f, Gradient Magnitude Std Dev: %.3f]n", magnitudeMean, magnitudeStdDev);
}
在技术 2 中,矩形边界周围的梯度将非常高,并且会破坏计算。
在计算梯度之前,请考虑放大掩码,以便此峰值位于发送到meanStdDev
函数的非扩张掩码之外。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 密码登录程序将永远循环并显示不正确的结果
- 如何让C++'tally up'结果并制定计划?
- 为什么这个程序的结果是3 "born"?和 4 死
- 计算平均值:蒙版图像与投资回报率的不同结果