2021-09-09

Posted qq_53299212

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-09-09相关的知识,希望对你有一定的参考价值。

Day2 图像算数(加法)

add

1.image = img1 + img2 :两张图片直接相加

import cv2
import numpy as np

img1 = cv2.imread('C:\\\\Users\\\\1\\\\PycharmProjects\\\\text\\\\1.jpeg')
img2 = cv2.imread('C:\\\\Users\\\\1\\\\PycharmProjects\\\\text\\\\1.jpeg')
image = img1 + img2
cv2.namedWindow('image', 0)
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()


2. 通过add()函数进行相加,与直接相加的区别在于,当两个点的像素值相加大于255时,add会将得到的值限制在255

import cv2
import numpy as np

img1 = cv2.imread('C:\\\\Users\\\\1\\\\PycharmProjects\\\\text\\\\1.jpeg')
img2 = cv2.imread('C:\\\\Users\\\\1\\\\PycharmProjects\\\\text\\\\1.jpeg')
image = cv2.add(img1, img2)
cv2.namedWindow('image', 0)
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()


3. addWeighted(src1, weight1, src2, weight2, add, image)
可以根据不同的权重进行图片的相加,add为做和后添加的数值,太大会导致到达255,图片为全白;image为图片输出;

import cv2
img1 = cv2.imread('C:\\\\Users\\\\1\\\\PycharmProjects\\\\text\\\\1.jpeg')
img2 = cv2.imread('C:\\\\Users\\\\1\\\\PycharmProjects\\\\text\\\\1.jpeg')

image = cv2.addWeighted(img1, 0.3, img2, 0.7, 1)

cv2.namedWindow('image')
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在对函数的解析文章中,很多以c++为工具的文章都以最后一个参数为输出,也就是不需要再image = addWeighted了,但实际在python环境中,似乎并不能这样做。

叠加

  1. 掩膜(mask)
    掩膜是图像处理中一个常见的概念,脱胎于半导体工艺。
    我将其理解为一种保护,保护掩膜区域内的数据,具体例子如下:

    可以看到在掩膜为1的地方原始图的数据保留了下来。
    具体实现措施为二者进行逻辑与,与mask中的0相与的数据全部归零,与1相与的数据则保留了下来。
  2. mask的制作:

    我们以在图片中插入python标志为例
img1gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)

将插入图片灰度化

ret, mask = cv2.threshold(img1gray, 220, 255, cv2.THRESH_BINARY_INV)

再进行二值化
cv2.threshold()函数的参数分别为:图片源,阈值,二值化的最大值,二值化的方式
具体参数:

可得:

因为我们是想要插入中间的python标志图像,所以我们可以现在原图中扣出一个空框出来,具体操作如下:

rows, cols, channels = img1.shape
roi = img2[0:rows, 0:cols]
img1gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img1gray, 220, 255, cv2.THRESH_BINARY_INV)
mask_inv = cv2.bitwise_not(mask)
roi = cv2.bitwise_and(roi, roi, mask=mask_inv)

这里我们用的是mask的逆图像,因为只有当图像为黑的部分,及灰度值为0,在与其他图像求与是会恒为0,达到了扣图的目的

3. 制作:
现在开始制作有效图像,现在我们需要得到有python标志的上图,因为上图中只有应有py标志的区域灰度值为0,所以我们需要有原彩的标志和为纯黑的背景图像,将两者相加即可得到。而掩膜的作用就是将需要的部分之外的全变成0,这也是我们制作两个掩膜的原因,一个保留图案,一个保留背景。全部代码如下:

import cv2
img1 = cv2.imread('C:\\\\Users\\\\1\\\\PycharmProjects\\\\text\\\\3.jpg')
img2 = cv2.imread('C:\\\\Users\\\\1\\\\PycharmProjects\\\\text\\\\1.jpeg')

rows, cols, channels = img1.shape
roi = img2[0:rows, 0:cols]
img1gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img1gray, 220, 255, cv2.THRESH_BINARY_INV)
mask_inv = cv2.bitwise_not(mask)
roi1 = cv2.bitwise_and(roi, roi, mask=mask_inv)
roi2 = cv2.bitwise_and(img1, img1, mask=mask)
roi = cv2.add(roi1, roi2)

img2[0:rows, 0:cols] = roi

cv2.namedWindow('image',cv2.WINDOW_NORMAL )
cv2.imshow('image', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()


最后将原图那部分区域进行替换即可

以上是关于2021-09-09的主要内容,如果未能解决你的问题,请参考以下文章

2021-09-09 WPF上位机 05-常用框架页面布局案例

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板