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 爬虫图片简单实现
Jun 01 Python
Python SqlAlchemy动态添加数据表字段实例解析
Feb 07 Python
使用python画个小猪佩奇的示例代码
Jun 06 Python
django实现用户注册实例讲解
Oct 30 Python
使用 Python 写一个简易的抽奖程序
Dec 08 Python
如何利用pygame实现简单的五子棋游戏
Dec 29 Python
Python datetime 格式化 明天,昨天实例
Mar 02 Python
Python中的xlrd模块使用原理解析
May 21 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
Jan 18 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
Jan 28 Python
仅用几行Python代码就能复制她的U盘文件?
Jun 26 Python
python运行脚本文件的三种方法实例
Jun 25 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
Protoss热键控制
2020/03/14 星际争霸
PHP Memcached + APC + 文件缓存封装实现代码
2010/03/11 PHP
用php随机生成福彩双色球号码的2种方法
2013/02/04 PHP
详解PHP防止盗链防止迅雷下载的方法
2017/04/26 PHP
List Installed Hot Fixes
2007/06/12 Javascript
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
用JQuery 判断某个属性是否存在hasAttr的解决方法
2013/04/26 Javascript
ajax提交表单实现网页无刷新注册示例
2014/05/08 Javascript
详细解读JavaScript的跨浏览器事件处理
2015/08/12 Javascript
使用CamanJS在Web页面上处理图像的技巧
2015/08/18 Javascript
JavaScript学习笔记之数组去重
2016/03/23 Javascript
jQuery EasyUI之验证框validatebox实例详解
2017/04/10 jQuery
JavaScript 获取元素在父节点中的下标(推荐)
2017/06/28 Javascript
详解Angular CLI + Electron 开发环境搭建
2017/07/20 Javascript
jQuery读取本地的json文件(实例讲解)
2017/10/31 jQuery
使用JS模拟锚点跳转的实例
2018/02/01 Javascript
JS判断两个数组或对象是否相同的方法示例
2019/02/28 Javascript
详解vue中v-model和v-bind绑定数据的异同
2020/08/10 Javascript
vue 获取元素额外生成的data-v-xxx操作
2020/09/09 Javascript
JavaScript 防盗链的原理以及破解方法
2020/12/29 Javascript
Python批量按比例缩小图片脚本分享
2015/05/21 Python
python调用并链接MATLAB脚本详解
2019/07/05 Python
python图片指定区域替换img.paste函数的使用
2020/04/09 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
使用CSS3设计地图上的雷达定位提示效果
2016/04/05 HTML / CSS
校庆筹备方案
2014/03/30 职场文书
公务员试用期满考核材料
2014/05/22 职场文书
个人承诺书格式
2014/06/03 职场文书
教师党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
工程承包协议书
2014/10/20 职场文书
卫生保健工作总结2015
2015/05/18 职场文书
唐山大地震的观后感
2015/06/05 职场文书
2015年高中语文教学总结
2015/08/18 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
Springboot使用Spring Data JPA实现数据库操作
2021/06/30 Java/Android
Python Matplotlib绘制两个Y轴图像
2022/04/13 Python