当前位置: 首页 > news >正文

Opencv图像基本操作——读取、显示、截取图像、属性、颜色通道、边界填充、图像融合

引言

我们都会有一个疑惑:计算机眼中的图像长什么样子呢?

首先拿来一张图片分割成无数个小格,每一个小格叫做像素点,计算机中的图像是由像素点构成的像素矩阵,像素点构成它的每一个值都是在0-255之间浮动的,表示亮度。当取值为零的时候就是黑色,取255超级亮了可以视为白色。R,G,B是颜色通道,彩色图像有三个颜色通道,灰度图像只有一个颜色通道。

一、读取图像

Opencv中读取图像它的通道是BGR当我们用matplotlib.pyplot绘图展示会有冲突,所以最好还是选取opencv中自带的展示比较好。

import matplotlib.pyplot as plt
import cv2
import numpy as np
img=cv2.imread('C:/superman.jpeg')
img

结果如图所示(img的类型是numpy.ndarray)

 二、图像显示

cv2.imshow(‘img’,img)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.waitKey(0):参数0代表任意键终止(图像显示之后按键盘任意键图像就可以停止展示)

如果不是0,比如1000(这代表等待时间,毫秒级别)

或者自己写个函数:

def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

结果展示;

 

三、彩色图像转换成灰度图

img1=cv2.imread('C:/Users/bwy/Desktop/superman.jpeg',cv2.IMREAD_GRAYSCALE)
img1
cv_show('image1',img1)

结果如图所示:

 四、图片截取

由于是数组形式所以我们可以用切片进行截取图像,代码如下:

img2=img1.copy()
img_cut=img2[120:300,0:550]
cv_show('img_c',img_cut)img2=img1.copy()
img_cut=img2[120:300,0:550]
cv_show('img_c',img_cut)

结果如图所示:

 五、颜色通道

#三个颜色通道分开
b,g,r=cv2.split(img)
b
b.shape#三个通道的shape并没有发生改变
#三个颜色通道合并
img=cv2.merge((b,g,r))

还可以这样用数组的形式:

img3[:,:,0]=0
img3[:,:,1]=0
img4[:,:,0]=0
img4[:,:,2]=0
img5[:,:,1]=0
img5[:,:,2]=0
cv_show('R',img3)
cv_show('G',img4)
cv_show('B',img5)

结果如图所示:

六、边界填充 

BORDER_REPLICATE:复制法,也就是复制最边缘像素。

BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|gfedcba

BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba

BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg

BORDER_CONSTANT:常量法,常数值填充。

#首先指定上下左右分别填充大小值
top_size,bottom_size,left_size,right_size=(50,50,50,50)
replicate=cv2.copyMakeBorder(img6,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)
reflect=cv2.copyMakeBorder(img6,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT)
reflect101=cv2.copyMakeBorder(img6,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT101)
wrap=cv2.copyMakeBorder(img6,top_size,bottom_size,left_size,right_size,cv2.BORDER_WRAP)
constant=cv2.copyMakeBorder(img6,top_size,bottom_size,left_size,right_size,cv2.BORDER_CONSTANT,value=0)#为0就是增加黑色边框
plt.subplot(231),plt.imshow(img6)
plt.subplot(232),plt.imshow(replicate)
plt.subplot(233),plt.imshow(reflect)
plt.subplot(234),plt.imshow(reflect101)
plt.subplot(235),plt.imshow(wrap)
plt.subplot(236),plt.imshow(constant)
plt.show()

结果如图所示:

 七、数值计算(由于像素矩阵的类型是numpy.ndarray但shape也得一样)

img_1=cv2.imread('C:/Users/bwy/Desktop/1.jpg')
img_1[:5,:,0]

 

array([[ 98,  97,  97, ..., 111, 112, 111],
       [ 98,  97,  97, ..., 109, 110, 110],
       [ 98,  97,  96, ..., 108, 108, 108],
       [ 97,  97,  96, ..., 108, 108, 108],
       [ 97,  96,  96, ..., 109, 109, 109]], dtype=uint8)

 

img_2=img_1+50
img_2[:5,:,0]
array([[148, 147, 147, ..., 161, 162, 161],
       [148, 147, 147, ..., 159, 160, 160],
       [148, 147, 146, ..., 158, 158, 158],
       [147, 147, 146, ..., 158, 158, 158],
       [147, 146, 146, ..., 159, 159, 159]], dtype=uint8)
(img_1+img_2)[:5,:,0]#对应元素相加

 结果是这样的:

 我们会发现右上角111+161=272但我们像素范围是(0-255)所以越界了,这个方法的处理办法是272%255

另一个方法:

cv2.add(img_1,img_2)[:5,:,0]

结果如图所示:

这个越界是通过直接255代替。

八、图像融合 

img_1.shape

结果:

(864, 1920, 3)
img6.shape

结果:

(337, 600, 3)
img_q=cv2.resize(img_1,(600,337))
cv_show('imgg',img_q)

结果:

 图像融合就是r=a*x1+b*x2+c(a,b代表权重,c代表偏置)

ppy=cv2.addWeighted(img6,0.4,img_q,0.6,0)
plt.show(ppy)

结果如图所示:

 

相关文章:

  • 商业管理和经济学哪个好ib?
  • 如何做自媒体在一个月内赚到2万?
  • 广和通5G/4G/NB-IoT智慧水务一体化联网解决方案精准加码水利数智化
  • 《Mycat分布式数据库架构》之故障切换
  • 大数据营销促进消费品牌增长,消费品投资回归常识思维
  • 题库接口系统搭建
  • [漏洞分析]CVE-2021-42008 6pack协议堆溢出内核提权
  • 网课题库接口搭建步骤
  • WordPress v6.0.2 开源强大的博客网站程序
  • Android开发之科大讯飞语音合成与播报
  • 【问题思考总结】截得两部分质量相等的点是否就是质心?
  • Word处理控件Aspose.Words功能演示:使用C#对PDF文件进行进一步修改和转换
  • 手把手教你做多重线性逐步回归
  • 猿创征文|前端进阶必备——WebSockt实现聊天室(附源码)
  • 计算机大一新生,想卷却找不到方向,恳请前辈指指路?
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 「译」Node.js Streams 基础
  • 【347天】每日项目总结系列085(2018.01.18)
  • EOS是什么
  • gf框架之分页模块(五) - 自定义分页
  • HTML中设置input等文本框为不可操作
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript类型识别
  • Js基础知识(一) - 变量
  • Logstash 参考指南(目录)
  • Next.js之基础概念(二)
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • React-flux杂记
  • REST架构的思考
  • webgl (原生)基础入门指南【一】
  • 电商搜索引擎的架构设计和性能优化
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 深入浅出webpack学习(1)--核心概念
  • 学习JavaScript数据结构与算法 — 树
  • 学习使用ExpressJS 4.0中的新Router
  • 译自由幺半群
  • ionic异常记录
  • Spring第一个helloWorld
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 移动端高清、多屏适配方案
  • ​插件化DPI在商用WIFI中的价值
  • ​第20课 在Android Native开发中加入新的C++类
  • !$boo在php中什么意思,php前戏
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $(function(){})与(function($){....})(jQuery)的区别
  • (003)SlickEdit Unity的补全
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • .a文件和.so文件