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命名空间详解
Aug 18 Python
python实现根据月份和日期得到星座的方法
Mar 27 Python
详解Python中的文本处理
Apr 11 Python
Python导出DBF文件到Excel的方法
Jul 25 Python
python实现网站的模拟登录
Jan 04 Python
python绘制热力图heatmap
Mar 23 Python
对python多线程中Lock()与RLock()锁详解
Jan 11 Python
详解python中@的用法
Mar 27 Python
pymysql的简单封装代码实例
Jan 08 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
Feb 12 Python
简单了解Python write writelines区别
Feb 27 Python
Python PIL按比例裁剪图片
May 11 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
关于在php.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
PHP的array_diff()函数在处理大数组时的效率问题
2011/11/27 PHP
php+ajax实现无刷新动态加载数据技术
2015/04/28 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
2017/02/08 PHP
JavaScript调用后台的三种方法实例
2013/10/17 Javascript
各种页面定时跳转(倒计时跳转)代码总结
2013/10/24 Javascript
Javascript中设置默认参数值示例
2014/09/11 Javascript
jQuery弹出层插件Lightbox_me使用指南
2015/04/21 Javascript
js+css实现有立体感的按钮式文字竖排菜单效果
2015/09/01 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
浅谈js中的延迟执行和定时执行
2016/05/31 Javascript
jQuery根据name属性进行查找的用法分析
2016/06/23 Javascript
JS及PHP代码编写八大排序算法
2016/07/12 Javascript
使用Angular CLI从蓝本生成代码详解
2018/03/24 Javascript
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
React路由管理之React Router总结
2018/05/10 Javascript
Angularjs实现页面模板清除的方法
2018/07/20 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
JS获取动态添加元素的方法详解
2019/07/31 Javascript
从零使用TypeScript开发项目打包发布到npm
2020/02/14 Javascript
详解JS预解析原理
2020/06/16 Javascript
基于脚手架创建Vue项目实现步骤详解
2020/08/03 Javascript
在Python中实现贪婪排名算法的教程
2015/04/17 Python
python 输出上个月的月末日期实例
2018/04/11 Python
Python最小二乘法矩阵
2019/01/02 Python
python模块内置属性概念及实例
2021/02/18 Python
CSS3 伪类选择器 nth-child()说明
2010/07/10 HTML / CSS
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
strlen的几种不同实现方法
2013/05/31 面试题
营销与策划专业毕业生求职信
2013/11/01 职场文书
人力资源部经理岗位职责规定
2014/02/23 职场文书
法制报告会主持词
2014/04/02 职场文书
2015年人民调解工作总结
2015/05/18 职场文书
交通事故调解协议书
2015/05/20 职场文书
Python包argparse模块常用方法
2021/06/04 Python