opencv中文文档

opencv中文文档


图像算术运算

<h1>目标</h1> <p>学习几种图像的算术运算,如加法、减法、位运算等。</p> <p>您将学习这些函数:cv.add()、cv.addWeighted()等。</p> <h2>图像添加</h2> <p>您可以通过OpenCV函数(cv.add())或简单的numpy操作(res = img1 + img2)添加两个图像。两个图像的深度和类型应该相同,或者第二个图像可以只是一个标量值。</p> <h4>注意</h4> <pre><code>OpenCV加法和Numpy加法是有区别的。OpenCV加法是饱和运算,Numpy加法是模运算。</code></pre> <p>例如,参考下面的例子:</p> <pre><code class="language-python">&gt;&gt;&gt; x = np.uint8([250]) &gt;&gt;&gt; y = np.uint8([10]) &gt;&gt;&gt; print( cv.add(x,y) ) # 250+10 = 260 =&gt; 255 [[255]] &gt;&gt;&gt; print( x+y ) # 250+10 = 260 % 256 = 4 [4]</code></pre> <p>当您添加两个图像时,它将更加可见。OpenCV函数将提供更好的结果。所以最好还是使用OpenCV函数。</p> <h2>图像融合</h2> <p>这也是图像的添加,但是给图像不同的权重,因此它给人一种混合或透明的感觉。图像按下式添加:</p> <p><strong>g(x)=(1−α)f0(x)+αf1(x)</strong></p> <p>通过改变α从0→1中,您可以执行一个很酷的一个图像之间的过渡到另一个地方。</p> <p>这里我拍了两张照片来把它们混合在一起。第一幅图像的权值为0.7,第二幅图像的权值为0.3。cv.addWeighted() 对图像应用如下公式。 <strong>dst=α⋅img1+β⋅img2+γ</strong></p> <p>这里γ视为0</p> <pre><code class="language-python">img1 = cv.imread('ml.png') img2 = cv.imread('opencv-logo.png') dst = cv.addWeighted(img1,0.7,img2,0.3,0) cv.imshow('dst',dst) cv.waitKey(0) cv.destroyAllWindows()</code></pre> <p>检查结果如下:</p> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/7cc0108fa3c5bae7cbaf1e9376711fb1?showdoc=.jpg" alt="" /></p> <h2>按位运算</h2> <p>这包括and和、OR、NOT和XOR操作。它们在提取图像的任何部分(我们将在接下来的章节中看到)、定义和处理非矩形ROI等方面都非常有用。下面我们将看到一个关于如何更改图像特定区域的示例。</p> <p>我想把OpenCV的标志放在图片上面。如果我添加两个图像,它会改变颜色。如果我混合它,我得到一个透明的效果。但我希望它是不透明的。如果是矩形区域,我可以像上一章那样使用ROI。但是OpenCV的logo不是矩形的。所以你可以做它的位操作如下:</p> <pre><code class="language-python"># Load two images img1 = cv.imread('messi5.jpg') img2 = cv.imread('opencv-logo-white.png') # I want to put logo on top-left corner, So I create a ROI rows,cols,channels = img2.shape roi = img1[0:rows, 0:cols ] # Now create a mask of logo and create its inverse mask also img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY) ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY) mask_inv = cv.bitwise_not(mask) # Now black-out the area of logo in ROI img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv) # Take only region of logo from logo image. img2_fg = cv.bitwise_and(img2,img2,mask = mask) # Put logo in ROI and modify the main image dst = cv.add(img1_bg,img2_fg) img1[0:rows, 0:cols ] = dst cv.imshow('res',img1) cv.waitKey(0) cv.destroyAllWindows()</code></pre> <p>参见下面的结果。左边的图片显示了我们创建的模板。右边的图片显示了最终的结果。为了更好地理解,请显示上述代码中的所有中间图像,特别是img1_bg和img2_fg。</p> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/4edfee8c218e7b96049a783096807fcc?showdoc=.jpg" alt="" /></p> <h1>练习</h1> <p>在一个文件夹中创建图片幻灯片,使用cv实现图片之间的平滑过渡。addWeighted函数</p>

页面列表

ITEM_HTML