python+opencv图像处理(四)——图像加法、图像融合

1.图像加法运算

1.1 运用numpy库

运用numpy库进行图像加法运算的方法为:取模运算
总像素值 = 图像1 + 图像2

1)当总像素值<=255时,像素值保持不变. 。如:56+124=180,即加法运算后的像素值为180
2)当总像素值>255时,像素值取(总像素值 - 255)。如:(250+46)- 255 = 41,即加法运算后的像素值为41

1.2 调用OpenCV

调用openCV 进行图像加法运算的方法为:饱和运算
核心函数为:目标图像 = cv2.add(图像1, 图像2)

1)当总像素值<=255时,像素值保持不变. 。如:56+124=180,即加法运算后的像素值为180
2)当总像素值>255时,像素值取255。如:(250+46)= 255

1.3 两种方法的运行代码和结果

注意:参与运算的图像大小和类型必须一致

两图的大小都为:400X400 类型都是:灰度图
若一个是灰度图,另一个是彩色图,运行会出错

程序代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
 #读取图像1
im1 = cv2.imread('D:\pythonb\wx01.jpg')  #400X400
src1 = cv2.cvtColor(im1, cv2.COLOR_BGR2RGB)
gray1 = cv2.cvtColor(src1,cv2.COLOR_BGR2GRAY)

因为下面是利用matplotlib.pyplot函数显示图像,所以必须先把图像转换为RGB模式;如果是用cv2.show()显示图像,则不需要转换。———这两天摸出来的小经验

 #读取图像2,并修改尺寸为400x400
im2 = cv2.imread('D:\pythonb\wx02.jpg') #960X960
src2 = cv2.cvtColor(im2, cv2.COLOR_BGR2RGB)
gray2 = cv2.cvtColor(src2,cv2.COLOR_BGR2GRAY)
new_im2 =cv2.resize(gray2,(400,400))  

PIL库修改尺寸:new_im2 = im2.resize((400,400))

 #法一:numpy加法
result1 = new_im2 + gray1

 #法二: opencv加法
result2 = cv2.add(gray1,new_im2)
titles = ['gray1','gray2','numpy','opencv']
images = [gray1,new_im2 ,result1,result2]
 #显示图像
for i in range(4):
    plt.subplot(2,2,i+1)
    plt.title(titles[i])
    plt.imshow(images[i],'gray')
    plt.xticks([]), plt.yticks([])
plt.show()

如果要显示灰度图,plt.imshow( ,‘gray’)里一定要加’gray’,否则显示的是彩色图————也是刚摸索出来的。。。

运行结果如下:
在这里插入图片描述

2.图像融合

图像融合技术可以提取自然光图像和红外图像的互补信息,获得对同一场景描述解释更为准确、全面和可靠的图像。像素级融合是常用于灰度图像与可见光图像的融合。基于源图像的彩色化就是源图像和目标图像的融合过程,使其同时兼有源图像的颜色和目标图像的形状、纹理等特征信息,达到整体颜色基调和谐、真实。
缺点:这种层面的融合方式对应设备的要求较高,一般计算量较大,不适合实时性需求。

2.1 运用openCV中的addWeighter()函数

图像融合在图像加法的基础上增加了系数亮度调节

目标图像 = 图像1 * 系数1 + 图像2 * 系数2 + 亮度调节量
调用的函数为:
dst = cv2.addWeighter(scr1, alpha, src2, beta, gamma)
dst = src1 * alpha + src2 * beta + gamma
其中参数gamma不能省略

程序运行代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt

加入中文字体支持:因为后续的图像标题用的是中文

from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc",size = 14)

#读取图片
im1 = cv2.imread('D:\pythonb\wx30.jpg')
src1 = cv2.cvtColor(im1, cv2.COLOR_BGR2RGB)

im2 = cv2.imread('D:\pythonb\wx020.jpg')
src2 = cv2.cvtColor(im2, cv2.COLOR_BGR2RGB)

图像融合:以第一幅图像透明度为0.5;第二幅图像透明度为0.7进行融合

result = cv2.addWeighted(src1, 0.5, src2, 0.7,1)

 #显示图像
titles = ['原图1', '原图2','融合后']
images = [src1, src2,result]

for i in range(3):
    plt.subplot(1, 3, i + 1)
    plt.imshow(images[i])
    plt.title(titles[i],FontProperties=font)
    plt.xticks([]), plt.yticks([])
plt.show()

注意:两张进行融合的图像像素大小需要一致.

运行结果如下图:
在这里插入图片描述

2.2 运用PIL库中的Image.blend()函数
from PIL import Image

取图像并修改尺寸大小

im1 = Image.open('D:\pythonb\wx3.jpg').crop((100,500,1500,2000)).resize((255,255))

为了和图像1的大小和模式一样 需重置大小和模式

im2 = Image.open('D:\pythonb\wx9.jpg').resize((255,255))    

new_im = im1 * (1 – 0.6) + im2* 0.6 进行。
按照第一张40%的透明度,第二张60%的透明度,合成为一张。

new_im = Image.blend(im1,im2,0.6)      #混合图像
new_im.show()
new_im.save('D:\pythonb\wx022.jpg')    #保存图像

运行结果如下:
融合图像

(by: dxz 2020 03 14 11:49 )

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用PythonOpenCV进行图像处理的例子: 首先,确保已经安装了PySimpleGUI、cv2和numpy库文件。可以使用以下命令通过pip安装它们: ```shell pip install pysimplegui pip install opencv-python pip install numpy ``` 然后,设计GUI界面。可以使用PySimpleGUI库来实现GUI可视化。以下是一个简单的GUI设计示例: ```python import PySimpleGUI as sg # 创建GUI窗口 layout = [[sg.Image(key='image')]] window = sg.Window('Image Processing', layout, finalize=True) # 打开内置摄像头 cap = cv2.VideoCapture(0) while True: event, values = window.read(timeout=0, timeout_key='timeout') # 实时读取图像 ret, frame = cap.read() # GUI实时更新 imgbytes = cv2.imencode('.png', frame)[1].tobytes() window['image'].update(data=imgbytes) if event == sg.WINDOW_CLOSED: break window.close() ``` 这段代码创建了一个名为"Image Processing"的GUI窗口,其中包含一个用于显示图像图像框。通过打开内置摄像头,可以实时读取图像,并将其显示在GUI窗口中。当用户关闭窗口时,程序退出。 4、实时图像处理 4.1、阈值二值化 阈值二值化是一种常用的图像处理技术,可以将图像转换为黑白二值图像。以下是一个简单的阈值二值化示例: ```python # 读取图像 image = cv2.imread('image.jpg', 0) # 阈值二值化 _, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY) # 显示结果 cv2.imshow('Binary Image', binary_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个例子中,首先使用cv2.imread()函数读取一张灰度图像。然后,使用cv2.threshold()函数将图像进行阈值二值化处理。最后,使用cv2.imshow()函数显示二值化后的图像

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值