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 01 Python
Python探索之自定义实现线程池
Oct 27 Python
Python三种遍历文件目录的方法实例代码
Jan 19 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
Dec 29 Python
在pycharm中使用git版本管理以及同步github的方法
Jan 16 Python
Python 使用folium绘制leaflet地图的实现方法
Jul 05 Python
Python Django实现layui风格+django分页功能的例子
Aug 29 Python
python+mysql实现个人论文管理系统
Oct 25 Python
PyTorch里面的torch.nn.Parameter()详解
Jan 03 Python
浅谈pytorch池化maxpool2D注意事项
Feb 18 Python
python爬虫开发之urllib模块详细使用方法与实例全解
Mar 09 Python
Python爬虫教程之利用正则表达式匹配网页内容
Dec 08 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 mongodb扩展时 需要注意的事项
2013/06/18 PHP
ueditor 1.2.6 使用方法说明
2013/07/24 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
2015/12/16 PHP
PHP常见数组排序方法小结
2018/08/20 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
2020/05/29 PHP
JS 判断代码全收集
2009/04/28 Javascript
同一个表单 根据要求递交到不同页面的实现方法小结
2009/08/05 Javascript
javascript iframe编程相关代码
2009/12/28 Javascript
jquery延迟加载外部js实现代码
2013/01/11 Javascript
通过JS来判断页面控件是否获取焦点
2014/01/03 Javascript
jQuery移动端日期(datedropper)和时间(timedropper)选择器附源码下载
2016/04/19 Javascript
使用JS实现图片展示瀑布流效果的实例代码
2016/09/12 Javascript
js中数组的常用方法小结
2016/12/30 Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
2019/04/30 Javascript
Python修改Excel数据的实例代码
2013/11/01 Python
Python入门教程之if语句的用法
2015/05/14 Python
Python中动态检测编码chardet的使用教程
2017/07/06 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
Django基础知识 URL路由系统详解
2019/07/18 Python
关于Python 常用获取元素 Driver 总结
2019/11/24 Python
pycharm sciview的图片另存为操作
2020/06/01 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
2020/06/06 Python
CSS3的Border-radius轻松制作圆角
2012/12/24 HTML / CSS
基于Modernizr 让网站进行优雅降级的分析
2013/04/21 HTML / CSS
Prototype中如何为一个元素添加一个方法
2014/12/08 面试题
教师实习的自我鉴定
2013/10/26 职场文书
房地产销售计划书
2014/01/10 职场文书
《画杨桃》教学反思
2014/04/13 职场文书
新党章的学习心得体会
2014/11/07 职场文书
2014年医院个人工作总结
2014/12/09 职场文书
团干部培训班心得体会
2016/01/06 职场文书
教你利用Selenium+python自动化来解决pip使用异常
2021/05/20 Python
pandas提升计算效率的一些方法汇总
2021/05/30 Python
利用Python判断你的密码难度等级
2021/06/02 Python
Golang获取List列表元素的四种方式
2022/04/20 Golang