提交 9a5038c8 编写于 作者: 片刻小哥哥's avatar 片刻小哥哥

更新链接

上级 bfdaf646
......@@ -119,7 +119,7 @@ UINT8
检查以下结果:
<div align=center>
<img src="img/roi.jpg">
<img src="https://opencv.apachecn.org/docs/4.0.0/img/roi.jpg">
</div>
## 拆分和合并图像通道
......@@ -184,7 +184,7 @@ plt.show()
请参阅下面的结果。(图像是通过 matplotlib 展示的。因此红色和蓝色通道将互换):
<div align=center>
<img src="img/border.jpg">
<img src="https://opencv.apachecn.org/docs/4.0.0/img/border.jpg">
</div>
## 其他资源
......
......@@ -30,7 +30,7 @@ OpenCV 相加操作和 Numpy 相加操作之间存在差异。OpenCV 添加是
这也是将图像相加,但是对图像赋予不同的权重,从而给出混合感或透明感。图像按以下等式添加:
<div align=center>
<img src="img/blending_equation.gif">
<img src="https://opencv.apachecn.org/docs/4.0.0/img/blending_equation.gif">
</div>
通过在(0,1)之间改变![](https://github.com/zhangqizky/opencv-doc-zh/blob/master/docs/4.0.0/img/alpha.gif)的值, 可以用来对两幅图像或两段视频产生时间上的 *画面叠化* (cross-dissolve)效果,就像在幻灯片放映和电影制作中那样(很酷吧?)(译者注:在幻灯片翻页时可以设置为前后页缓慢过渡以产生叠加效果,电影中经常在情节过渡时出现画面叠加效果)。
......@@ -38,7 +38,7 @@ OpenCV 相加操作和 Numpy 相加操作之间存在差异。OpenCV 添加是
在这里,我拍了两张图片将它们混合在一起。第一图像的权重为 0.7,第二图像的权重为 0.3。[cv.addWeighted()](https://docs.opencv.org/4.0.0/d2/de8/group__core__array.html#gafafb2513349db3bcff51f54ee5592a19)在图像上应用以下等式。
<div align=center>
<img src="img/blending_equation.gif">
<img src="https://opencv.apachecn.org/docs/4.0.0/img/blending_equation.gif">
</div>
```Python
......@@ -54,7 +54,7 @@ cv.destroyAllWindows()
观察以下结果:
<div align=center>
<img src="img/blending.jpg">
<img src="https://opencv.apachecn.org/docs/4.0.0/img/blending.jpg">
</div>
......@@ -89,7 +89,7 @@ cv.destroyAllWindows()
请参阅下面的结果。左图显示了我们创建的蒙版。右图显示最终结果。为了加深理解,请在上面的代码中显示所有中间图像,尤其是 img1_bg 和 img2_fg。
<div align=center>
<img src="img/overlay.jpg">
<img src="https://opencv.apachecn.org/docs/4.0.0/img/overlay.jpg">
</div>
## 其他资源
......
......@@ -8,7 +8,7 @@
### 线性可分离数据
考虑下面的图像有两种类型的数据,红色和蓝色。在 kNN 中,对于一个测试数据,我们通常要计算它与所有训练样本的距离,并选择最短距离的那个。计算与所有样本的距离花费了大量时间,而且存储所有的训练样本要花费大量的内存。但是,对于图片中所给出的数据,我们真的需要这么多吗?
<div align=center>
<img src="img/svm_basics1.png"> </br>
<img src="https://opencv.apachecn.org/docs/4.0.0/img/svm_basics1.png"> </br>
<b>图像</b>
</div>
......@@ -16,7 +16,7 @@
在上图中,你可以看到很多这样的直线。我们将选哪一条?非常直观地说,该直线应该尽可能远离所有点。为什么呢?因为输入数据中可能存在噪声数据。这些噪声数据不应影响分类准确性。因此,选择最远的直线将提供更强的抗噪声能力。因此,SVM 所做的是找到与训练样本具有最大最小距离的直线(或超平面)。请参见下图中穿过中心的粗线。
<div align=center>
<img src="img/svm_basics2.png"> </br>
<img src="https://opencv.apachecn.org/docs/4.0.0/img/svm_basics2.png"> </br>
<b>图像</b>
</div>
......@@ -24,7 +24,7 @@
发生了什么事呢?首先,有两个超平面被发现最能代表数据。例如,蓝色数据由 **w<sup>T</sup>x + b<sub>0</sub> > 1** 表示,而红色数据由 **w<sup>T</sup>x + b<sub>0</sub> < -1** 表示,其中 **w** 是权重向量( **w = [w<sub>1</sub>,w<sub>2</sub>,...,w<sub>n</sub>]** ), **x** 是特征向量( **x = [x<sub>1</sub>,x<sub>2</sub>,...,x<sub>n</sub>]** ), **b<sub>0</sub>** 是偏差。权重向量决定决策边界的方向,而偏差点决定其位置。现在,决策边界被定义为这些超平面的中间,因此表示为 **w<sup>T</sup>x + b<sub>0</sub> = 0** 。从支持向量到决策边界的最小距离由 **distance<sub>support vectors</sub> = 1/||w||** 给出。间距是这个距离的两倍,我们需要最大化这个间距。即我们需要最小化一个新函数 **L(w,b<sub>0</sub>)** ,其中一些约束可以表示如下:
<div align=center>
<img src="img/svm_func1.png"> </br>
<img src="https://opencv.apachecn.org/docs/4.0.0/img/svm_func1.png"> </br>
</div>
其中 ti 是每个类的标签, **t<sub>i</sub> ∈ [-1,1]**
......@@ -38,12 +38,12 @@
考虑二维空间中的两个点, **p = (p<sub>1</sub>, p<sub>2</sub>)****q = (q<sub>1</sub>, q<sub>2</sub>)** 。设 ***Φ*** 是一个映射函数,它将二维的点映射到三维空间,如下所示:
<div align=center>
<img src="img/svm_func2.png"> </br>
<img src="https://opencv.apachecn.org/docs/4.0.0/img/svm_func2.png"> </br>
</div>
让我们定义一个核函数 ***K*(*p*,*q*)** ,它在两点之间做一个点积,如下所示:
<div align=center>
<img src="img/svm_func3.png"> </br>
<img src="https://opencv.apachecn.org/docs/4.0.0/img/svm_func3.png"> </br>
</div>
......@@ -51,18 +51,18 @@
除了所有这些概念之外,还存在分类错误的问题。因此,仅仅找到具有最大间距的决策边界是不够的。我们还需要考虑分类错误的问题。有时,可能会找到间距较小的决策边界,但分类错误减少。无论如何,我们需要修改我们的模型,使其找到具有最大间距的决策边界,但分类错误较少。最小化标准修改为:
<div align=center>
<img src="img/svm_func4.png"> </br>
<img src="https://opencv.apachecn.org/docs/4.0.0/img/svm_func4.png"> </br>
</div>
下图显示了这个概念。对于训练数据的每个样本,定义新参数 ***ξ*<sub>i</sub>** 。它是从相应的训练样本到正确决策区域的距离。对于那些没有被错误分类的数据,它们会落在相应的支持平面上,因此它们的距离为零。
<div align=center>
<img src="img/svm_basics3.png"> </br>
<img src="https://opencv.apachecn.org/docs/4.0.0/img/svm_basics3.png"> </br>
<b>图像</b>
</div>
所以新的优化问题是:
<div align=center>
<img src="img/svm_func5.png"> </br>
<img src="https://opencv.apachecn.org/docs/4.0.0/img/svm_func5.png"> </br>
</div>
如何选择参数 C?很明显,这个问题的答案取决于训练数据的分布方式。虽然没有一般性答案,但考虑以下规则很有用:
......
......@@ -20,7 +20,7 @@ def deskew(img):
```
下图展示了应用于零图像的上述矫正函数。左图是原始图像,右图是矫正后的图像。
<div align=center>
<img src="img/deskew.jpg"> </br>
<img src="https://opencv.apachecn.org/docs/4.0.0/img/deskew.jpg"> </br>
<b>图像</b>
</div>
接下来,我们必须找到每个单元的 HOG 描述符。为此,我们在 X 和 Y 方向找到每个单元的 Sobel 导数。然后,在每个像素处找到它们的大小和梯度方向。该梯度被量化为 0~16 间的整数。将此图像分为四个子方块。对于每个子方块,计算使用大小加权的方向的直方图(16 bins)。因此,每个子方块都会给你一个有 16 个值的向量。四个这样的向量(四个子方块)一起给出了有着 64 个值的特征向量。这是我们用来训练数据的特征向量。
......
......@@ -8,13 +8,13 @@
### T 恤大小问题
举个例子,有一家公司将向市场推出一种新型 T 恤。显然,他们必须制造不同尺寸的衣服,以满足各种身材的人。为此,公司收集了一份人的身高和体重的数据,并将其绘制成图表,如下所示:
<div align=center>
<img src="img/tshirt.jpg"> </br>
<img src="https://opencv.apachecn.org/docs/4.0.0/img/tshirt.jpg"> </br>
<b>图像</b>
</div>
公司不能制作所有尺寸的 T 恤。相反,他们将人们划分为小巧、中等和高大,并且仅制造这 3 种尺寸的衣服,以满足所有人的需求。将人群分为 3 组这种事情可以用 K-Means 聚类算法来完成,并且算法能够给我们找出最合适的 3 个尺寸,让所有人满意。如果不行,公司可以将人们分成更多的组,可能是 5 组,或者其它。查看下图:
<div align=center>
<img src="img/tshirt_grouped.jpg"> </br>
<img src="https://opencv.apachecn.org/docs/4.0.0/img/tshirt_grouped.jpg"> </br>
<b>图像</b>
</div>
......@@ -23,7 +23,7 @@
考虑如下的一组数据(你可以将其视为 T 恤问题)。我们需要将这些数据分成两组。
<div align=center>
<img src="img/testdata.jpg"> </br>
<img src="https://opencv.apachecn.org/docs/4.0.0/img/testdata.jpg"> </br>
<b>图像</b>
</div>
......@@ -33,7 +33,7 @@
在这个例子中,我们用红色标记所有的'0',用蓝色标记所有的'1'。在上述操作之后,我们得到了下图:
<div align=center>
<img src="img/initial_labelling.jpg"> </br>
<img src="https://opencv.apachecn.org/docs/4.0.0/img/initial_labelling.jpg"> </br>
<b>图像</b>
</div>
......@@ -43,18 +43,18 @@
然后我们得到了如下结果:
<div align=center>
<img src="img/update_centroid.jpg"> </br>
<img src="https://opencv.apachecn.org/docs/4.0.0/img/update_centroid.jpg"> </br>
<b>图像</b>
</div>
现在,迭代 **步骤二****步骤三**,直到两个中心点收敛到固定点。\*( 或者可能根据我们所给的条件停止,如最大迭代次数,或达到特定的准去率等。)\* **这些点使得测试数据与其对应的中心点之间的距离之和最小。** 或者简单地说,***C1↔红色点*** 和 ***C2↔蓝色点*** 之间的距离之和最小。
<div align=center>
<img src="img/kmeans_func1.png"> </br>
<img src="https://opencv.apachecn.org/docs/4.0.0/img/kmeans_func1.png"> </br>
</div>
最终结果大概如下所示:
<div align=center>
<img src="img/final_clusters.jpg"> </br>
<img src="https://opencv.apachecn.org/docs/4.0.0/img/final_clusters.jpg"> </br>
<b>图像</b>
</div>
......
......@@ -53,7 +53,7 @@ plt.hist(z,256,[0,256]),plt.show()
所以我们有'z',这是一个大小为 50 的数组,值范围从 0 到 255。我已经将'z' 重塑为列向量。当存在多个特征时,它将更有用。然后我将类型数据转为 np.float32 。
我们得到以下图片:
<div align="center"><img src="img/oc_1d_testdata.png" /> <br> <b>图像</b></div>
<div align="center"><img src="https://opencv.apachecn.org/docs/4.0.0/img/oc_1d_testdata.png" /> <br> <b>图像</b></div>
现在我们应用 KMeans 功能。在此之前,我们需要指定标准。我的标准是,每当运行 10 次迭代算法或达到 epsilon = 1.0 的精度时,就停止算法并返回答案。
......@@ -81,7 +81,7 @@ plt.hist(centers,32,[0,256],color = 'y')
plt.show()
```
以下是我们得到的输出:
<div align="center"><img src="img/oc_1d_clustered.png" /> <br> <b>图像</b></div>
<div align="center"><img src="https://opencv.apachecn.org/docs/4.0.0/img/oc_1d_clustered.png" /> <br> <b>图像</b></div>
## 2.具有多个特征的数据
在前面的例子中,我们只采取了 T 恤问题的高度。在这里,我们将采用高度和重量,即两个特征。
......@@ -89,7 +89,7 @@ plt.show()
请记住,在前一种情况下,我们将数据制作为单个列向量。 每个特征排列在一列中,而每行对应一个输入测试样本。
举个例子,在本例中,我们将测试数据集的大小设为 50x2 ,这是 50 个人的高度和体重。第一列对应着 50 个人的高度,第二列对应着他们的重量。第一行包含两个元素,其中第一个元素是第一人的高度,第二个元素是他的重量。类似地,剩余的行对应于其他人的高度和重量。查看下图:
<div align="center"><img src="img/oc_feature_representation.jpg" /> <br> <b>图像</b></div>
<div align="center"><img src="https://opencv.apachecn.org/docs/4.0.0/img/oc_feature_representation.jpg" /> <br> <b>图像</b></div>
现在我直接转到代码:
```python
......@@ -121,7 +121,7 @@ plt.show()
```
以下是我们得到的输出:
<div align="center"><img src="img/oc_2d_clustered.jpg" /> <br> <b>图像</b></div>
<div align="center"><img src="https://opencv.apachecn.org/docs/4.0.0/img/oc_2d_clustered.jpg" /> <br> <b>图像</b></div>
## 3.色彩量化
色彩量化是减少图像中颜色数量的过程。这样做的一个原因是减少内存。有时,某些设备可能具有限制,使得它只能产生有限数量的颜色。在那些情况下,也执行色彩量化。这里我们使用 k-means 聚类进行色彩量化。
......@@ -154,7 +154,7 @@ cv.destroyAllWindows()
```
对于 K = 8,请参见下面的结果:
<div align="center"><img src="img/oc_color_quantization.jpg" /> <br> <b>图像</b></div>
<div align="center"><img src="https://opencv.apachecn.org/docs/4.0.0/img/oc_color_quantization.jpg" /> <br> <b>图像</b></div>
## 额外资源
## 练习
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册