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 相关文章推荐
操作Windows注册表的简单的Python程序制作教程
Apr 07 Python
一些Python中的二维数组的操作方法
May 02 Python
Python读取键盘输入的2种方法
Jun 16 Python
Python的Django框架中的URL配置与松耦合
Jul 15 Python
浅析python递归函数和河内塔问题
Apr 18 Python
Python使用PyCrypto实现AES加密功能示例
May 22 Python
Python实现购物车功能的方法分析
Nov 10 Python
matplotlib设置legend图例代码示例
Dec 19 Python
PyQt5高级界面控件之QTableWidget的具体使用方法
Feb 23 Python
Python基于Dlib的人脸识别系统的实现
Feb 26 Python
Python通过Pillow实现图片对比
Apr 29 Python
python实现爱奇艺登陆密码RSA加密的方法示例详解
May 27 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的FTP学习(四)
2006/10/09 PHP
PHP CodeBase:将时间显示为&quot;刚刚&quot;&quot;n分钟/小时前&quot;的方法详解
2013/06/06 PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
2013/07/15 PHP
关于PHP中interface的用处详解
2020/07/26 PHP
js模拟点击事件实现代码
2012/11/06 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
JS的框架Polymer中的dom-if和is属性使用说明
2015/07/29 Javascript
jQuery焦点图轮播特效代码分享(3款)
2015/09/05 Javascript
JSONP原理及简单实现
2016/06/08 Javascript
jQuery Validate插件实现表单验证
2016/08/19 Javascript
浅谈React 属性和状态的一些总结
2016/11/21 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
webpack中CommonsChunkPlugin详细教程(小结)
2017/11/09 Javascript
浅谈layer的Icon样式以及一些常用的layer窗口使用方法
2019/09/11 Javascript
关于引入vue.js 文件的知识点总结
2020/01/28 Javascript
vue使用video插件vue-video-player的示例
2020/10/03 Javascript
vue将文件/图片批量打包下载zip的教程
2020/10/21 Javascript
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
Python 使用requests模块发送GET和POST请求的实现代码
2016/09/21 Python
Python 处理数据的实例详解
2017/08/10 Python
python代码实现ID3决策树算法
2017/12/20 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
2020/01/25 Python
Python numpy多维数组实现原理详解
2020/03/10 Python
Python列表去重复项的N种方法(实例代码)
2020/05/12 Python
浅谈移动端网页图片预加载方案
2018/11/05 HTML / CSS
阿迪达斯奥地利官方商城:adidas.at
2016/10/16 全球购物
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
《走一步再走一步》教学反思
2014/02/15 职场文书
英语教学随笔感言
2014/02/20 职场文书
《颐和园》教学反思
2014/02/26 职场文书
个人收入证明模板
2014/09/18 职场文书
2014年超市工作总结
2014/11/19 职场文书
信访维稳承诺书
2015/05/04 职场文书
小学数学教师研修感悟
2015/11/18 职场文书
Python matplotlib绘制条形统计图 处理多个实验多组观测值
2022/04/21 Python