Python+OpenCV实现图像融合的原理及代码


Posted in Python onDecember 03, 2018

根据导师作业安排,在学习数字图像处理(刚萨雷斯版)第六章 彩色图像处理 中的彩色模型后,导师安排了一个比较有趣的作业:

Python+OpenCV实现图像融合的原理及代码

融合原理为:

1 注意:遥感原RGB图image和灰度图Grayimage为测试用的输入图像;

2 步骤:(1)将RGB转换为HSV空间(H:色调,S:饱和度,V:明度);

(2)用Gray图像诶换掉HSV中的V;

(3)替换后的HSV转换回RGB空间即可得到结果。

书上只介绍了HSI彩色模型,并没有说到HSV,所以需要网上查找资料。

Python代码如下:

import cv2
import numpy as np
import math
from matplotlib import pyplot as plt
def caijian(img):#裁剪图像与否根据选择图像大小而定,调用了OpenCV函数
weight=img.shape[0]
height=img.shape[1]
print(“图像大小为:%d*%d”%(weight,height))
img=cv2.resize(img,(int(weight/2),int(height/2)),interpolation=cv2.INTER_CUBIC)
return(img)
def graytograyimg(img):
grayimg=img1
weight=img.shape[0]
height=img.shape[1]
for i in range(weight):
for j in range(height):
grayimg[i,j]=0.299img[i,j,0]+0.587img[i,j,1]+0.114img[i,j,2]
return(grayimg)
def RGBtoHSV(img):
b,g,r=cv2.split(img)
rows,cols=b.shape
H=np.ones([rows,cols],“float”)
S=np.ones([rows,cols],“float”)
V=np.ones([rows,cols],“float”)
print(“RGB图像大小:%d*%d”%(rows,cols))
for i in range(0, rows):
for j in range(0, cols):
MAX=max((b[i,j],g[i,j],r[i,j]))
MIN=min((b[i,j],g[i,j],r[i,j]))
V[i,j]=MAX
if V[i,j]0:
S[i,j]=0
else:
S[i,j]=(V[i,j]-MIN)/V[i,j]
if MAXMIN:
H[i,j]=0 # 如果rgb三向量相同,色调为黑
elif V[i,j]==r[i,j]:
H[i,j]=(60*(float(g[i,j])-b[i,j])/(V[i,j]-MIN))
elif V[i,j]==g[i,j]:
H[i,j]=60*(float(b[i,j])-r[i,j])/(V[i,j]-MIN)+120
elif V[i,j]==b[i,j]:
H[i,j]=60*(float(r[i,j])-g[i,j])/(V[i,j]-MIN)+240
if H[i,j]<0:
H[i,j]=H[i,j]+360
H[i,j]=H[i,j]/2
S[i,j]=255*S[i,j]
result=cv2.merge((H,S,V)) # cv2.merge函数是合并单通道成多通道
result=np.uint8(result)
return(result)
def graytoHSgry(grayimg,HSVimg):
H,S,V=cv2.split(HSVimg)
rows,cols=V.shape
for i in range(rows):
for j in range(cols):
V[i,j]=grayimg[i][j][0]
newimg=cv2.merge([H,S,V])
newimg=np.uint8(newimg)
return newimg
def HSVtoRGB(img,rgb):
h1,s1,v1=cv2.split(img)
rg = rgb.copy()
rows,cols=h1.shape
r,g,b=0.0,0.0,0.0
b1,g1,r1 = cv2.split(rg)
print(“HSV图像大小为:%d*%d”%(rows,cols))
for i in range(rows):
for j in range(cols):
h=h1[i][j]
v=v1[i][j]/255
s=s1[i][j]/255
h=h2
hx=int(h/60.0)
hi=hx%6
f=hx-hi
p=v(1-s)
q=v*(1-fs)
t=v(1-(1-f)s)
if hi0:
r,g,b=v,t,p
elif hi1:
r,g,b=q,v,p
elif hi2:
r,g,b=p,v,t
elif hi3:
r,g,b=p,q,v
elif hi4:
r,g,b=t,p,v
elif hi5:
r,g,b=v,p,q
r,g,b=(r255),(g255),(b255)
r1[i][j]=int®
g1[i][j]=int(g)
b1[i][j]=int(b)
rg=cv2.merge([b1,g1,r1])
return rg
img=cv2.imread(“D:/RGB.bmp”)
gray=cv2.imread(“D:/gray.bmp”)
img=caijian(img)
gray=caijian(gray)
grayimg=graytograyimg(gray)
HSVimg=RGBtoHSV(img)
HSgray=graytoHSgry(grayimg,HSVimg)
RGBimg=HSVtoRGB(HSgray,img)
cv2.imshow(“image”,img)
cv2.imshow(“Grayimage”,grayimg)
cv2.imshow(“HSVimage”,HSVimg)
cv2.imshow(“HSGrayimage”,HSgray)
cv2.imshow(“RGBimage”,RGBimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

以上代码是在尽量不调用OpenCV函数的情况下编写,其目的是熟悉图像处理原理和Python编程,注释很少,其中RGB转HSV原理,HSV转RGB原理,在CSDN中都能找到,灰度图替换HSV中的V原理其实很简单,看代码就能明白,不用再找资料。

总结

以上所述是小编给大家介绍的Python+OpenCV实现图像融合的原理及代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
介绍Python中的一些高级编程技巧
Apr 02 Python
Python编程之多态用法实例详解
May 19 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
Jun 21 Python
Python如何快速实现分布式任务
Jul 06 Python
Python网络编程 Python套接字编程
Sep 13 Python
python numpy格式化打印的实例
May 14 Python
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
Jun 13 Python
解决每次打开pycharm直接进入项目的问题
Oct 28 Python
Python将列表数据写入文件(txt, csv,excel)
Apr 03 Python
python time.sleep()是睡眠线程还是进程
Jul 09 Python
Python+Appium实现自动化测试的使用步骤
Mar 24 Python
详解pycharm2020.1.1专业版安装指南(推荐)
Aug 07 Python
浅谈python脚本设置运行参数的方法
Dec 03 #Python
Linux 修改Python命令的方法示例
Dec 03 #Python
解决Python一行输出不显示的问题
Dec 03 #Python
解决vscode python print 输出窗口中文乱码的问题
Dec 03 #Python
pycharm运行程序时在Python console窗口中运行的方法
Dec 03 #Python
Python小工具之消耗系统指定大小内存的方法
Dec 03 #Python
使用memory_profiler监测python代码运行时内存消耗方法
Dec 03 #Python
You might like
WINXP下apache+php4+mysql
2006/11/25 PHP
apache2.2.4+mysql5.0.77+php5.2.8安装精简
2009/04/29 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
php合并数组中相同元素的方法
2014/11/13 PHP
PHP PDO fetch 模式各种参数的输出结果一览
2015/01/07 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
推荐17个优美新鲜的jQuery的工具提示插件
2012/09/14 Javascript
js二维数组定义和初始化的三种方法总结
2014/03/03 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
2015/11/02 Javascript
原生js实现简单的Ripple按钮实例代码
2017/03/24 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
vue.js做一个简单的编辑菜谱功能
2018/05/08 Javascript
Angularjs Ng_repeat中实现复选框选中并显示不同的样式方法
2018/09/12 Javascript
express + jwt + postMan验证实现持久化登录
2019/06/05 Javascript
前端深入理解Typescript泛型概念
2020/03/09 Javascript
JavaScript Event Loop相关原理解析
2020/06/10 Javascript
Vue+Java+Base64实现条码解析的示例
2020/09/23 Javascript
vue mvvm数据响应实现
2020/11/11 Javascript
用实例分析Python中method的参数传递过程
2015/04/02 Python
python通过ftplib登录到ftp服务器的方法
2015/05/08 Python
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
Flask框架中密码的加盐哈希加密和验证功能的用法详解
2016/06/07 Python
Python发展简史 Python来历
2019/05/14 Python
Python模块zipfile原理及使用方法详解
2020/08/04 Python
python定时截屏实现
2020/11/02 Python
html5使用canvas压缩图片的示例代码
2018/09/11 HTML / CSS
存储过程的优点有哪些
2012/09/27 面试题
代理班主任的自我评价
2014/02/04 职场文书
教师职称自我鉴定
2014/02/12 职场文书
幼儿园评语大全
2014/04/17 职场文书
感恩父母的演讲稿
2014/05/06 职场文书
志愿者事迹材料
2014/12/26 职场文书
公积金接收函格式
2015/01/30 职场文书
爱心捐助活动总结
2015/05/09 职场文书
高一作文之乐趣
2019/11/21 职场文书