源码如何做网站,怎么用手机黑网站,网站搭建好显示建设中,WordPress投票主题系统在OpenCV中#xff0c;可以对于图片进行算法运算。我们知道#xff0c;图像的本质其实就是矩阵#xff0c;因此对于图像的算数运算本质上就是对于矩阵的算术运算。在OpenCV可以对图像进行算术运算的操作有加、减、乘、除等操作。
图像的加、减、乘、除操作
两张图像可以进…在OpenCV中可以对于图片进行算法运算。我们知道图像的本质其实就是矩阵因此对于图像的算数运算本质上就是对于矩阵的算术运算。在OpenCV可以对图像进行算术运算的操作有加、减、乘、除等操作。
图像的加、减、乘、除操作
两张图像可以进行算术运算操作即对两图像的矩阵进行加减操作。例如文件夹中有两张图片 现在想把这两张图像加起来首先先获取两张图片的行数和列数
import cv2
import matplotlib.pyplot as plt
import numpy as npimg1cv2.imread(rD:\Photo\1.jpeg)
img2cv2.imread(rD:\Photo\2.jpeg)
print(img1.shape)
print(img2.shape)
运行结果如下所示
(500, 500, 3)
(500, 667, 3) 可以看到两张图片的行数相等但是列数第二张图片的列数较大因此在如果两个图像要进行算术运算操作需要行数和列数需要保持一致因此只能将图像截取。
1将上面两张图片进行相加操作
import cv2
import matplotlib.pyplot as plt
import numpy as npimage_dogcv2.imread(rD:\Photo\1.jpeg)
image_catcv2.imread(rD:\Photo\2.jpeg)
image_catcv2.resize(image_cat,(500,500))
image_newimage_catimage_dog
cv2.imshow(image_new,image_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下所示 可以看到图片的所运行出来的结果就是每一个像素进行叠加运行出来的结果为上图所示。
2同样也可以进行相减的操作只需要将上面代码中的image_newimage_cat-image_dog即可。即为
image_newimage_cat-image_dog
运行结果如下所示 3同样也可以进行相乘的操作只需要将上面代码中的image_newimage_cat*image_dog即可。
image_newimage_cat*image_dog
运行结果如下所示 由于相乘结果数值相差较大因此所得到的结果比较混乱。
4图像的算数操作同样可以对数进行操作例如将图像所对应的矩阵里的数全部除以2代码为
import cv2
import matplotlib.pyplot as plt
import numpy as npimg_dogcv2.imread(rD:\Photo\1.jpeg)
resimg_dog//2
plt.imshow(res)
运行结果为 通过图片可以看出图片整体变暗了原因是图片对应的矩阵的值变为原来的一半。
图片的叠加
1图片不可以这样简单地进行算数运算同时也可以进行叠加即为图像的加权融合在OpenCV使用cv2.addWeigthed()进行叠加。在cv2.addWeighted()中至少需要输入四个参数即为第一个需要加权融合的图片第一个图片所占的权重第二个需要加权融合的图片第二个图片所占的权重例如
import cv2
import matplotlib.pyplot as plt
import numpy as npimg_dogcv2.imread(rD:\Photo\1.jpeg)
img_catcv2.imread(rD:\Photo\2.jpeg)
img_catcv2.resize(img_cat,(500,500))
rescv2.addWeighted(img_cat,0.5,img_dog,0.5,0)
plt.imshow(res)
运行效果如下所示 2此时两张图片的权重各占0.5如果修改权重将image_cat改为0.7image_dog改为0.3那么只需修改代码
rescv2.addWeighted(img_cat,0.7,img_dog,0.3,0)
运行效果为 可以看到当image_cat为0.7image_dog为0.3的时候可以看到猫的图片占据了主导地位。
3需要说明的是图片的叠加可以用图片的算术操作完成例如加权融合的权重为0.5时下面两句代码效果等效
rescv2.addWeighted(img_1,0.5,img_2,0.5,0)
resimg_1//2img_1//2
用上面的例子进行验证
import cv2
import matplotlib.pyplot as plt
import numpy as npimg_dogcv2.imread(rD:\Photo\1.jpeg)
img_catcv2.imread(rD:\Photo\2.jpeg)
img_catcv2.resize(img_cat,(500,500))
res1cv2.addWeighted(img_cat,0.5,img_dog,0.5,0)
res2img_cat//2img_dog//2
cv2.imshow(res1,res1)
cv2.imshow(res2,res2)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行效果如下所示 可以看到完全相同所以对图片进行融合的时候两种方法都可以。
多通道图像拆分为多个单通道图像
在OpenCV中利用cv2.split()将多个颜色通道图像例如BGR格式的彩色图像拆分为多个单独的灰色图像每个灰度图像代表原图像的一个颜色通道。 注split()函数需要完成三个任务 通道分离它可以将一个三通道的BGR图像分离成三个单通道的灰度图像分别是蓝色、绿色和红色通道。数据结构split()函数可以接受两种类型的输出参数一种是Mat数组另一种是std::vectorMat。在Python中通常使用numpy数组来接收分离后的通道。使用方式当你有一个Mat对象表示的图像时可以调用split()函数并传入该对象以及一个用于存放结果的数组或向量。这样原图像的每个通道就会被提取出来并存储在指定的位置。 例如
import cv2
import matplotlib.pyplot as plt
import numpy as np#颜色通道提取
imgcv2.imread(rD:\Photo\1.jpeg)
b,g,rcv2.split(img)
print(b通道\n)
print(b)
print(g通道\n)
print(g)
print(r通道\n)
print(r) 运行结果为
b通道[[186 186 186 ... 30 41 34][186 186 186 ... 39 46 36][186 186 186 ... 39 41 29]...[160 161 165 ... 37 59 101][160 161 163 ... 42 39 62][154 155 157 ... 62 40 52]]
g通道[[118 118 118 ... 51 61 54][118 118 118 ... 59 66 56][118 118 118 ... 59 61 49]...[177 178 181 ... 73 95 137][177 178 180 ... 76 72 96][171 172 173 ... 96 74 85]]
r通道[[ 70 70 70 ... 45 55 48][ 70 70 70 ... 53 60 51][ 70 70 70 ... 53 55 44]...[188 189 192 ... 81 103 145][188 189 191 ... 84 81 104][182 183 184 ... 104 82 93]]
通过上面结果可以看到一张RGB图像分成了三个通道每个通道有不同的数据内容。而不同颜色通道的图片是什么样子的呢下面我们分别展示B、G、R通道
import cv2
import matplotlib.pyplot as plt
import numpy as npimgcv2.imread(rD:\Photo\1.jpeg)
#只保留R通道
cur_img1img.copy()
cur_img1[:,:,0]0
cur_img1[:,:,1]0
#只保留G通道
cur_img2img.copy()
cur_img2[:,:,0]0
cur_img2[:,:,2]0
#只保留B通道
cur_img3img.copy()
cur_img3[:,:,1]0
cur_img3[:,:,2]0
cv2.imshow(R通道,cur_img1)
cv2.imshow(G通道,cur_img2)
cv2.imshow(B通道,cur_img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下所示 上面通道所展示的结果是B通道、G通道、R通道所呈现的内容。