sub 减运算
<p>[TOC]</p>
<h5>简要描述</h5>
<ul>
<li>减运算。可降低图像亮度。可使用它做“帧差法”计算。</li>
</ul>
<h5>参数</h5>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名</th>
<th style="text-align: left;">必选</th>
<th style="text-align: left;">类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">mat1</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">mat</td>
<td>参与计算的mat对象。 mat1-mat2</td>
</tr>
<tr>
<td style="text-align: left;">mat2</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">mat</td>
<td>参与计算的mat对象。</td>
</tr>
</tbody>
</table>
<h5>返回参数说明</h5>
<p>mat | null</p>
<h5>帧差法,提取图片彩色边缘(由于保留了领域差,所以是无锯齿的)</h5>
<pre><code class="language-java">function test_2() {
var mat=cvImg.loadFromFile("/sdcard/z1.png");
var w=cvImg.getWidth(mat);
var h=cvImg.getHeight(mat);
var type=cvImg.getType(mat);
//帧差法模拟X轴梯度
var mat_n=cvImg.zeros(w,h,type,[0,0,0,0]);//创建模板
//留左边
cvImg.bitBlt(
mat_n,
1,0,-1,-1,
mat,
0,0,w-1,h,
1,0
);
var mat_sub_x1=cvImg.sub(mat,mat_n);
cvImg.toFile(mat_n,"/sdcard/mat_n.png");
cvImg.toFile(mat_sub_x1,"/sdcard/mat_sub_x1.png");
//留顶边
cvImg.rectangle(mat_n,0,0,w,h,[0,0,0,0,0],-1);
cvImg.bitBlt(
mat_n,
0,1,-1,-1,
mat,
0,0,w,h-1,
1,0
);
var mat_sub_y1=cvImg.sub(mat,mat_n);
cvImg.toFile(mat_n,"/sdcard/mat_n.png");
cvImg.toFile(mat_sub_y1,"/sdcard/mat_sub_y1.png");
//留右边
cvImg.rectangle(mat_n,0,0,w,h,[0,0,0,0,0],-1);
cvImg.bitBlt(
mat_n,
0,0,-1,-1,
mat,
1,0,w-1,h,
1,0
);
var mat_sub_x2=cvImg.sub(mat,mat_n);
cvImg.toFile(mat_n,"/sdcard/mat_n.png");
cvImg.toFile(mat_sub_x2,"/sdcard/mat_sub_x2.png");
//留底边
cvImg.rectangle(mat_n,0,0,w,h,[0,0,0,0,0],-1);
cvImg.bitBlt(
mat_n,
0,0,-1,-1,
mat,
0,1,w,h-1,
1,0
);
var mat_sub_y2=cvImg.sub(mat,mat_n);
cvImg.toFile(mat_n,"/sdcard/mat_n.png");
cvImg.toFile(mat_sub_y2,"/sdcard/mat_sub_y2.png");
//合成编译
var mat_add=cvImg.or(mat_sub_x1 ,mat_sub_x2);
mat_add=cvImg.or(mat_add ,mat_sub_y1);
mat_add=cvImg.or(mat_add ,mat_sub_y2);
cvImg.toFile(mat_add,"/sdcard/mat_add.png")
cvImg.toFile(cvImg.and(mat,mat_add),"/sdcard/mat_xor.png")
}</code></pre>
<p>原图
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=b600c92845bccd9f8c873542c68bc01d&file=file.png" alt="" /></p>
<p>帧差法(sub)合成(or)
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=ec317e709b38201b1e08d091d33d0cd0&file=file.png" alt="" /></p>
<h5>示例(sub减少图像亮度)</h5>
<pre><code class="language-java"> //载入动漫图像
var mat=cvImg.loadFromFile("/sdcard/Pictures/tem.jpg");
//创建掩模,类型、大小与动漫大小一样。并填充一些颜色
var mat_mask=cvImg.zeros(mat.cols(),mat.rows(),mat.type());
cvImg.rectangle(mat_mask,0,0,mat_mask.cols(),mat_mask.rows(),[100,100,100,0],1000);
cvImg.toFile(mat_mask,"/sdcard/Pictures/tem2.jpg");
//进行sub运算
var mat_result=cvImg.sub(mat,mat_mask);
cvImg.toFile(mat_result,"/sdcard/Pictures/tem3.jpg");
cvImg.release(mat);//释放
cvImg.release(mat_mask);//释放
cvImg.release(mat_result);//释放</code></pre>
<p>原图
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=9a179f27b3a007215a59551fcec4f7be" alt="" /></p>
<p>掩模图
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=91e310a9a116e7b1caf453e6f2adc9e2" alt="" /></p>
<p>效果
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=61e86a4802718eb71b08cb85e0c27395" alt="" /></p>