Python-图像上的算术运算

Posted 司砚章

tags:

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

图像加法

你可以使用函数cv2.add() 将两幅图像进行加法运算,当然也可以直接使
用numpy,res=img1+img。两幅图像的大小,类型必须一致,或者第二个
图像可以使一个简单的标量值。

image

import numpy as np
import cv2
from matplotlib import pyplot as plt
import matplotlib.image as mpimg # mpimg 用于读取图片

x=np.uint8([250])
y=np.uint8([10])
z1=cv2.add(x,y)
print(z1)
z2=x+y
print(z2)

image

image

这种差别在你对两幅图像进行加法时会更加明显。OpenCV 的结果会更好
一点。所以我们尽量使用OpenCV 中的函数。

图像混合

这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混
合或者透明的感觉。图像混合的计算公式如下:

image

通过修改a的值(0 -> 1),可以实现非常酷的混合。

现在我们把两幅图混合在一起。第一幅图的权重是0.7,第二幅图的权重
是0.3。函数cv2.addWeighted() 可以按下面的公式对图片进行混合操作。

image

这里r的取值为0。

import numpy as np
import cv2
from matplotlib import pyplot as plt
import matplotlib.image as mpimg # mpimg 用于读取图片

img1=cv2.imread(\'3.jpg\')
img2=cv2.imread(\'4.jpg\')
dst=cv2.addWeighted(img1,0.7,img2,0.3,0)
cv2.imshow(\'dst\',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

image

image

image

裁剪图像

import cv2
import numpy as np

from PIL import Image

img = cv2.imread("2.jpeg")
print(img.shape)
cropped = img[0:1200, 0:1200]  # 裁剪坐标为[y0:y1, x0:x1]
cv2.imwrite("2.png", cropped)

按位运算

这里包括的按位操作有:AND,OR,NOT,XOR 等。当我们提取图像的一部分,选择非矩形ROI 时这些操作会很有用。下面的例子就是教给我们如何改变一幅图的特定区域。

我想把树叶的标志放到另一幅图像上。如果我使用加法,颜色会改变,如果使用混合,会得到透明效果,但是我不想要透明。如果他是矩形我可以象上一章那样使用ROI。但是他不是矩形。但是我们可以通过下面的按位运算实现:

import numpy as np
import cv2
from matplotlib import pyplot as plt
import matplotlib.image as mpimg # mpimg 用于读取图片

#让img2的logo放在img1的左上角 所以创建一个ROI
img1=cv2.imread(\'4.jpg\')
img2=cv2.imread(\'5.jpg\')
rows,cols,channels=img2.shape
roi=img1[0:rows,0:cols]

#创建掩模
img2gray=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret,mask=cv2.threshold(img2gray,175,255,cv2.THRESH_BINARY)
cv2.imshow(\'mask\',mask)
#反运算
mask_inv=cv2.bitwise_not(mask)
cv2.imshow(\'mask_inv\',mask_inv)

# 取roi 中与mask 中不为零的值对应的像素的值,其他值为0
# 注意这里必须有mask=mask 或者mask=mask_inv, 其中的mask= 不能忽略
img1_bg=cv2.bitwise_and(roi,roi,mask=mask)
cv2.imshow(\'img1_bg\',img1_bg)
# 取roi 中与mask_inv 中不为零的值对应的像素的值,其他值为0。
# Take only region of logo from logo image.
img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv)
cv2.imshow(\'img2_bg\',img2_fg)

# Put logo in ROI and modify the main image
dst = cv2.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv2.imshow(\'res\',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如下,为了帮助大家理解我把上面程序的中间结果也显示了出来,特别是img1_bg 和img2_fg。

image

以上是关于Python-图像上的算术运算的主要内容,如果未能解决你的问题,请参考以下文章

AI基础python:openCV——图像算术运算:按位运算

OpenCV的核心操作 —— 图像的基本操作+图像上的算术运算

AI基础python:openCV——图像算术运算

[Python从零到壹] 三十六.图像处理基础篇之图像算术与逻辑运算详解

详解图像处理的算术运算与逻辑运算

获取 badarith,[erlang,'+',[error,0],[],同时使用 Erlang 片段在 TSUNG 中执行算术运算