- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据this documentation of opencv,this link和this link:
C++:
void fastNlMeansDenoising(InputArray src, OutputArray dst, float h=3, int templateWindowSize=7, int searchWindowSize=21 )
python :
cv2.fastNlMeansDenoising(src[, dst[, h[, templateWindowSize[, searchWindowSize]]]]) → dst
参数如下(
或):
dst = cv2.method(input, param1, param2, ..., paramx)
。而且我们不需要在方法内部放置任何内容(即,我们不需要这样做:
dst = cv2.method(input, None, param1, param2, ..., paramx)
。
fastNlMeansDenoising
。
import cv2
import numpy as np
def thresh(filename):
img = cv2.imread(filename)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#without adding None instead of dst
test_1 = cv2.fastNlMeansDenoising(gray, 31, 7, 21)
cv2.imwrite('test_1.jpg', test_1)
# Adding None instead of dst
test_2 = cv2.fastNlMeansDenoising(gray, None, 31, 7, 21)
cv2.imwrite('test_2.jpg', test_2)
# putting dst inside the method
test_3 = np.empty(gray.shape, np.uint8)
cv2.fastNlMeansDenoising(gray, test_3, 31, 7, 21)
cv2.imwrite('test_3.jpg', test_3)
# Adding the input params
test_4 = cv2.fastNlMeansDenoising(gray, h=31, templateWindowSize=7,
searchWindowSize=21)
cv2.imwrite('test_4.jpg', test_4)
blur = cv2.bilateralFilter(gray, 31, 7, 21)
cv2.imwrite('blur.jpg', blur)
blur_ = cv2.bilateralFilter(gray, 31, 7, 21, None)
cv2.imwrite('blur_.jpg', blur_)
blur__ = np.empty(gray.shape, np.uint8)
cv2.bilateralFilter(gray, 31, 7, 21, blur__)
cv2.imwrite('blur__.jpg', blur__)
thresh('test.png')
这是输入图像:
gray
相同(好像
test_1
没有收到
fastNlMeansDenoising
的输出)。
bilateralFilter
并非如此:blur.jpg,blur_.jpg和blur __。jpg都是相同的,尽管我重复了与
fastNlMeansDenoising
相同的过程。
None
参数中添加
fastNlMeansDenoising
?
最佳答案
函数fastNlMeansDenoising
首先让我们看一下the Python function的签名:
cv2.fastNlMeansDenoising(src[, dst[, h[, templateWindowSize[, searchWindowSize]]]]) → dst
[]
)嵌套的方式意味着第2-5个参数是可选的,但是只要将它们作为位置参数传递进来,序列就必须保持相同(即,您不能跳过任何一个)。
cv2.fastNlMeansDenoising(src) → dst
cv2.fastNlMeansDenoising(src, dst) → dst
cv2.fastNlMeansDenoising(src, dst, h) → dst
cv2.fastNlMeansDenoising(src, dst, h, templateWindowSize) → dst
cv2.fastNlMeansDenoising(src, dst, h, templateWindowSize, searchWindowSize) → dst
void fastNlMeansDenoising(InputArray src, OutputArray dst, float h=3, int templateWindowSize=7, int searchWindowSize=21)
h=3
,
templateWindowSize=7
和
searchWindowSize=21
。在Python绑定(bind)中,
OutputArray
参数隐式具有
None
(与C++ API不同,Python变体也返回输出)。
test_1 = cv2.fastNlMeansDenoising(gray, 31, 7, 21)
test_1 = cv2.fastNlMeansDenoising(src=gray, dst=31, h=7, templateWindowSize=21, searchWindowSize=21)
h
比您预期的要小得多,而
templateWindowSize
则要大得多。这就是为什么结果不同的原因。
dst
设置为31不会导致任何明显的错误在稍后的答案中引发。
dst
的最佳方法:
test_4 = cv2.fastNlMeansDenoising(gray, h=31, templateWindowSize=7, searchWindowSize=21)
None
作为第二个参数传递)是可以的。
bilateralFilter
bilateralFilter
是为了进行比较,因此我们也对其进行检查。
cv.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) → dst
cv.bilateralFilter(src, d, sigmaColor, sigmaSpace) → dst
cv.bilateralFilter(src, d, sigmaColor, sigmaSpace, dst) → dst
cv.bilateralFilter(src, d, sigmaColor, sigmaSpace, dst, borderType) → dst
dst
参数出现在序列的后面,因此您可能会犯一个错误,那就是传入border类型。
borderType
,并且在所有情况下
dst
都具有有意义的值。
dst
后面的可选参数越少,击掌的机会就越少。
fastNlMeansDenoising
的代码部分:
static PyObject* pyopencv_cv_fastNlMeansDenoising(PyObject* , PyObject* args, PyObject* kw)
{
using namespace cv;
{
PyObject* pyobj_src = NULL;
Mat src;
PyObject* pyobj_dst = NULL;
Mat dst;
float h=3;
int templateWindowSize=7;
int searchWindowSize=21;
const char* keywords[] = { "src", "dst", "h", "templateWindowSize", "searchWindowSize", NULL };
if( PyArg_ParseTupleAndKeywords(args, kw, "O|Ofii:fastNlMeansDenoising", (char**)keywords, &pyobj_src, &pyobj_dst, &h, &templateWindowSize, &searchWindowSize) &&
pyopencv_to(pyobj_src, src, ArgInfo("src", 0)) &&
pyopencv_to(pyobj_dst, dst, ArgInfo("dst", 1)) )
{
ERRWRAP2(cv::fastNlMeansDenoising(src, dst, h, templateWindowSize, searchWindowSize));
return pyopencv_from(dst);
}
}
// Clear Python error, try the same for UMat
// Clear Python error, try overload with Mat
// Clear Python error, try overload with UMat
return NULL;
}
PyArg_ParseTupleAndKeywords
用于解析函数参数,并将其值分配给相应的C++变量(如果可选且缺少,则保留预设的默认值)。
Input/OutputArray
时,它将被解析为Python对象(格式字符串中的
O
)-这意味着在此阶段它可以是任何东西。
pyopencv_to
用于将Python对象转换为
cv::Mat
。由于许多OpenCV函数(例如
cv::add
)都允许某些输入参数(以及潜在的输出参数)既是数组又是标量,因此Python绑定(bind)也支持此功能。
cv::Mat
的工作方式如下:
None
,则保留一个空的Mat
。 Mat
,该行具有4行1列,数据类型为64位浮点值。将第一行设置为提供的整数的值,其余设置为0。Mat
,该行具有n
行和1列,数据类型为64位浮点值,其中n
是元组中的元素数。每行依次包含一个元素。 cv2.fastNlMeansDenoising(gray, 31, 7, 21)
时,整数
31
成为具有64位浮点元素的4x1单通道
Mat
。因此,可以毫无问题地调用基础C++函数。现在,为什么不抱怨
Mat
的大小和数据类型存储输出错误?
OutputArray
的工作方式
Mat
或形状或数据类型不正确的
Mat
的情况下,将重新创建
Mat
(分配新的缓冲区等)以满足要求。由于
Mat
本质上是指向底层图像缓冲区的智能指针,因此可以正常工作,并且在C++中非常可预测(IMHO)-即使发生重新分配,您作为输出参数提供的
Mat
实例也将正确地引用新数据。
31
可以作为
dst
正常的原因-它产生了错误的形状和类型的
Mat
,但是只是重新分配了,一切都很好。
Input/OutputArray
参数提供numpy数组时,将创建一个
Mat
实例,该实例共享用于保存值的基础缓冲区。这意味着操作很快(因为没有数据被复制),并且numpy数组自动反射(reflect)了对
Mat
所做的更改。但是,如果OpenCV由于形状/类型不正确而重新分配了
Mat
,则会分配一个新缓冲区,并且原始numpy数组将保持不变。
>>> a = np.ones((3,3), np.uint8)
>>> b = a + 1
>>> c = np.zeros(a.shape, np.float32)
>>> c
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]], dtype=float32)
>>> cv2.add(a, b, c)
array([[3, 3, 3],
[3, 3, 3],
[3, 3, 3]], dtype=uint8)
>>> c
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]], dtype=float32)
>>> d = np.zeros_like(a)
>>> cv2.add(a, b, d)
array([[3, 3, 3],
[3, 3, 3],
[3, 3, 3]], dtype=uint8)
>>> d
array([[3, 3, 3],
[3, 3, 3],
[3, 3, 3]], dtype=uint8)
关于python - cv2.fastNlMeansDenoising()的怪异行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59424253/
我不明白为什么有两段代码要做完全相同的事情,却在 Scala 中做不同的事情。 第一个例子: scala> val ggg = Source.fromFile("/somefile"); ggg: s
您认为以下结果如何? SELECT CHARINDEX('space and /* comment */', 'Phrase with space and /* comment */') AS Mat
我正在尝试为单元测试创建带有某些修饰符的 MouseEvent。我使用的是 J2SE,以下代码无法通过: public void testMouseEventProblem() { Mouse
为什么输出0而不是1? System.out.println((int) (Math.ceil(1/2))); 虽然这个正确输出 1 System.out.println((int) (Math.ce
如果我运行这段代码: var a = new Float32Array(3); a[0] = 1; a[1] = 1.1; a[2] = 1.00001; 我得到了a的结果: [1, 1.100000
今天刚开始使用“UIRefreshControl”,发现了一些奇怪的事情。 如果我在 InterfaceBuilder 中创建了 UIRefreshControl,并将其连接起来,我的选择器将永远不会
这是一个非常简单的问题,但是 PHP 文档没有解释为什么会这样。 我有这个代码: var_dump($newattributes); var_dump($oldattributes); var_dum
如果我通常加载一个 UITabBarController 并在 View 之间切换,它会调用每个 View Controller 的 viewWillAppear。但事实并非如此。 我想在触摸另一个标
我有一个关于 setContentOffset 的奇怪问题,我似乎无法解决:我正在尝试构建一个“无尽”的 ScrollView ,所以我想在某个位置重置内容偏移量。使用下面的代码,setContent
这个把我难住了。 我有一个 java.sql.ResultSet,我正在从中提取字符串值,如下所示: address.setAddressLine1(rs.getString("AddressLine
...至少对我来说。这段代码曾经工作得很好。我很确定什么都没有改变,但现在突然间它的行为变得奇怪了。基本上我正在尝试创建内联编辑功能。当用户单击该链接时,它会动态生成一个文本框以及一个确认和取消链接。
我在 ldd 中遇到了以下奇怪的情况 $ sudo ldd ./monit not a dynamic executable $ readelf -d monit Dynamic sectio
我的 app.config 文件发生了一件奇怪的事情。我的 ConnectionStrings 部分包含以下内容: 但是,当我通过 ConfigurationManager.Connecti
CSS 不是我的强项,我不确定我的列表项在 IE6 中发生了什么。我希望它们垂直对齐,但第一个列表项总是被向右推一两个像素,因此它不再与列表中的其他成员对齐。就我而言,此列表在 IE7/8、FF3 和
制作了一个网络作品集。我的名字周围有联系方式。文本的初始宽度为 0,当鼠标悬停时,图标会随着“过渡”属性展开。左边的图标工作正常,但右边的图标过渡很奇怪,尤其是手机。 http://jsfiddle.
发生的事情是我遵循了这个demo ,我修改了它以满足我的需要,让它工作,将其更改为使用函数绘制两个图形,但现在使用 plt.show() 或 plt 根本不起作用。 savefig() 这是我的代码
我正在尝试编写一个从整数中提取最低阶数的函数。例如: > 24689.lowest_order => 9 到目前为止我有: class Integer def lowest_order I
不确定这是包中的错误还是由于其他原因,但我们开始吧。 我正在使用以下包在相似性分数的对称矩阵(大小为 10x10)上查找最大特征值及其对应的特征向量: scipy.sparse.linalg.eige
我正在尝试实现一个名为“inet_pton”的函数,它将 IPv4 或 IPv6 的字符串表示形式(如“66.102.1.147”[google])转换为二进制网络字节有序形式。这是我的代码的相关部分
比较 float 。根据第一个代码块,5 大于 37.66。第二个 block 声称 5 小于 37.66。 toFixed() 对这些使第一个 block 按照它的方式使用react的是什么? (这
我是一名优秀的程序员,十分优秀!