opencv之图片处理看这一篇就够了(一)
因为最近公司项目需要用到opencv对图像进行处理,所以对这一块进行了学习,现在将自己学习到的东西记录下来,以便使用。
一、图像读取与显示
import cv2
import numpy as npimg = cv2.imread("soble.png")
cv2.imshow("soble",img)
cv2.waitKey(10000)
但是这里有个坑,如果是中文路径,你就会发现图片读取不出来,需要换个方法
#path为图片路径
img_np = np.fromfile(path, dtype = np.uint8)
imgs = cv2.imdecode(img_np, -1)
二、图像处理基础
1.像素处理
读取像素
读取图片像素时,如果图片为灰度图像则返回的为灰度值,如果是BGR图像,返回值为B,G,R的值。
import cv2
import numpy as npimg = cv2.imread("soble.png")
#如果为灰度图像则只有一个返回值,如果BGR图像返回三个值
p = img[11,11]
print(p)
正常情况下彩色图片返回的为BGR三通道的值,如果想单独获取某一个通道值则在位置后面加上通道
import cv2
import numpy as npimg = cv2.imread("soble.png")
#如果为灰度图像则只有一个返回值,如果BGR图像返回三个值,如果加上通道值则只返回当前通道的值【0,1,2】代表蓝绿红三个通道
blue = img[11,11,0]
#此时返回蓝色通道值
print(blue)green = img[11,11,1]
#此时返回绿色通道值
print(green)red = img[11,11,2]
#此时返回红色通道值
print(red)
修改像素值
如果为灰度图像则修改方式为:
img[11,11] = 255
如果为BGR图像则修改方式为:
img[11,11] = [255,255,255]
或者
img[11,11,0] = 255
img[11,11,1] = 255
img[11,11,2] = 255
2.使用numpy访问
读取像素
这个操作大致上获取像素值跟上面是完全相似的。也是分为灰度图片和BGR图片两种,返回值也是一样的。如果是灰度图片则只返回一个值,如果是BGR图片则返回三个值
import cv2
import numpy as npimg = cv2.imread("soble.png")
blue = img.item(78,125,0)
green = img.item(78,125,1)
red = img.item(78,125,2)
print(blue)
print(green)
print(red)
修改像素值
相比于不使用numpy,numpy对像素的设置更加方便。
操作方式如下:
import cv2
import numpy as npimg = cv2.imread("soble.png")
#灰度图像:接收两个参数,第一个参数为像素位置,第二个位置为像素值
img.itemset((88,99),255)#BGR图像 也是接收两个参数,第一个参数为像素位置,但是多了一个通道,第二个为像素值
img.itemset((88,99,0),255)
img.itemset((88,99,0),255)
img.itemset((88,99,0),255)
3.获取图像属性
opencv获取图像的属性包含三个方面
- 形状:行、列、通道数
- 像素数目
- 图像的数据类型
1.形状
shape可以获取图像的形状
返回包含行数,列数,通道数的元组。如果是灰度图像则返回行数和列数,如果是BGR图像则返回行数、列数、通道数
import cv2
import numpy as np#读取图像
img = cv2.imread("soble.png")
#将图像转为灰度图像
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)print(img.shape) #输出值为(428, 605, 3)print(gray.shape) #输出值为(428, 605)
2.像素数目
size可以获取图像的像素数目
如果是灰度图像返回行数*列数,如果是BGR图像则返回行数*列数*通道数目
import cv2
import numpy as npimg = cv2.imread("soble.png")
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)print(img.size) #输出值为776820
print(gray.size) #输出值258940
可以看出将图片转为灰色图像后,图片只剩下一个通道,相比于BGR图片像素减少了很多
3.图像类型
dtype返回的是图像的数据类型
import cv2
import numpy as npimg = cv2.imread("soble.png")
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)print(img.dtype) #uint8
print(gray.dtype) #uint8
4.感兴趣区域(ROI)
ROI(region of interest),感兴趣区域
从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域。
可以通过各种算子(operator)和函数来求得感兴趣区域ROI,并进行图像的下一步处理。
import cv2
import numpy as npimg = cv2.imread("soble.png")cv2.imshow('ori',img)temp = img[100:300,100:300]
img[100:300,400:600] = tempcv2.imshow('temp',img)
cv2.waitKey()
cv2.destroyAllWindows()
5.通道的拆分与合并
1.拆分通道
import cv2
import numpy as npimg = cv2.imread("soble.png")
cv2.imshow('ori',img)b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]
cv2.imshow('b',b)
cv2.imshow('g',g)
cv2.imshow('r',r)
cv2.waitKey()
cv2.destroyAllWindows()
也可以采用opencv提供的工具类进行通道拆分
import cv2
import numpy as npimg = cv2.imread("soble.png")
cv2.imshow('ori',img)b,g,r = cv2.split(img)
cv2.imshow('b',b)
cv2.imshow('g',g)
cv2.imshow('r',r)
cv2.waitKey()
cv2.destroyAllWindows()
两种拆分方式结果相同,展示如下:
2.合并通道
通过opencv提供的工具类进行操作
import cv2
import numpy as npimg = cv2.imread("soble.png")
cv2.imshow('ori',img)
b,g,r = cv2.split(img)
result = cv2.merge([b,g,r])
cv2.imshow('result',result)
cv2.waitKey()
cv2.destroyAllWindows()
可以看到合并后和拆分之前的图像一致。
三、图像运算
1.图像加法
Numpy加法
numpy加法采用取模加法,如果两个像素相加,当像素值小于255时则取当前相加的像素值,如果相加的像素值大于255的话则拿当前像素值对255取模
OpenCV加法
OpenCV加法采用饱和运算加法,运算方式: 结果 = cv2.add(图像1,图像2)
采用饱和运算相加时,如果相加像素值低于255则取当前相加像素值,如果相加像素值大于255则取255作为当前像素值。
需要注意的问题(参与运算的图像大小、类型必须一致)
下面代码来操作一下:
import cv2
import numpy as npimg = cv2.imread("soble.png")
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('ori',img)
a = img + img
b = cv2.add(img,img)
cv2.imshow('a',a)
cv2.imshow('b',b)
cv2.waitKey()
cv2.destroyAllWindows()
可以看出来这个图像直接相加存在很大问题,相加以后图片跟原来的图片差别很大。所以接下来要介绍的是比较常用的图像融合。相比于这个简单的图像相加效果会更好。
2.图像融合
结果图像 = 图像1*系数1 + 图像2* 系数2 + 亮度调节量
img = img1*0.3 + img2*0.7 +18
图像融合函数 addWeighted
dst = cv.addWeighted(src1,alpha,src2,beta,gamma)
dst = src1*alpha + src2*beta + gamma;
需要注意的是参数gamma不能省略
import cv2
import numpy as npimg = cv2.imread("soble.png")
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('ori',img)
result = cv2.addWeighted(img,0.3,img,0.7,0)
cv2.imshow('result',result)
cv2.waitKey()
cv2.destroyAllWindows()
经过试验发现,可以发现alpha和beta就是控制图片的显示占比,哪张图片的系数大,那么哪张图片就比较明显。
四、类型转换
将图像由一种类型转换为另外一种类型
OpenCV提供了200多种图片转换方式,有需要的参考官方文档即可
举个简单的例子,就拿BGR转gray来说:
import cv2
import numpy as npimg = cv2.imread("soble.png")
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray',gray)
cv2.waitKey()
cv2.destroyAllWindows()
五、几何变换
1.图像缩放
dst = cv2.resize(src,dsize)
disze 缩放大小
b = cv2.resize(a,(122,122))
dst = cv2.resize(src,dsize,fx,fy)
fx,fy缩放大小,如果dsize不为空则按照dsize进行缩放,如果为空则按照fx,fy进行缩放
b = cv2.resize(a,None,fx=0.5,fy=0.7)
代码示例:
import cv2
import numpy as npimg = cv2.imread("soble.png")
rows,cols = img.shape[:2]
b=cv2.resize(img,(round(cols*0.5),round(rows*1.2)))
cv2.imshow('ori',img)
cv2.imshow('resize',b)
cv2.waitKey()
cv2.destroyAllWindows()
import cv2
import numpy as npimg = cv2.imread("soble.png")
rows,cols = img.shape[:2]
b=cv2.resize(img,None,fx=1,fy=0.5)
cv2.imshow('ori',img)
cv2.imshow('resize',b)
cv2.waitKey()
cv2.destroyAllWindows()
2.图像翻转
dst = cv2.flip(src,flipCode)
flipCode = 0 以X为对称轴进行翻转
flipCode > 0 以y轴为对称轴进行翻转
flipCode < 0 以y轴为对称轴进行翻转,再以x轴为对称轴进行翻转
代码示例:
import cv2
import numpy as npimg = cv2.imread("soble.png")
b= cv2.flip(img,0)
c= cv2.flip(img,1)
d= cv2.flip(img,-1)
cv2.imshow('ori',img)
cv2.imshow('b',b)
cv2.imshow('c',c)
cv2.imshow('d',d)
cv2.waitKey()
cv2.destroyAllWindows()
由于时间原因,今天先写到这里剩余部分有时间会接着写。
opencv之图片处理看这一篇就够了(一)相关推荐
- Android Studio制作.9图片,看这一篇就够了
一..9.png图片概念 这是安卓开发里面的一种特殊的图片 这种格式的图片在android 环境下具有自适应调节大小的能力,不会失真 (1)允许开发人员定义可扩展区域,当需要延伸图片以填充比图片本身更 ...
- 1盒子刷Armbian,看这一篇就够了——Armbian全方位安装指导书
N1盒子刷Armbian,看这一篇就够了--Armbian全方位安装指导书 2020-03-30 19:04:11 72点赞 715收藏 122评论 创作立场声明:一个写完之后很累很累的年轻人 追加修 ...
- 2019-5-25-win10-uwp-win2d-入门-看这一篇就够了
title author date CreateTime categories win10 uwp win2d 入门 看这一篇就够了 lindexi 2019-5-25 20:0:52 +0800 2 ...
- 大厂面试爱问的HashMap死锁问题,看这一篇就够了
大厂面试爱问的HashMap死锁问题,看这一篇就够了 JDK 1.7 HashMap源码分析 put()方法 addEntry()方法 resize()方法 transfer()方法(重点) 死锁演示 ...
- 技术交底书怎么撰写?看这一篇就够了
文章目录 技术交底书怎么撰写?看这一篇就够了 专利技术交底书格式 1. 发明(或实用新型 以下同)的名称 2. 技术领域 3. 背景技术 4. 发明内容 5. 附图说明 6. 具体实施方式 技术交底书 ...
- 17万字 JUC 看这一篇就够了(三) (精华)
今天我们继续来学习Java并发编程 Juc框架 ,把剩余部分学习完 17万字 JUC 看这一篇就够了(一) (精华) 17万字 JUC 看这一篇就够了(二) (精华) 文章目录 非公原理 加锁 解锁 ...
- VR模式全景图的实现看这一篇就够了
VR模式全景图的实现看这一篇就够了 在搞VR之前一直是个小白,写下这篇博客也只是记录下我们的这些天走过的坎.给真正想玩转全景图的朋友一些参考建议,由于在这方面还是一个新手,还请前辈多指教. 所需软件 ...
- 如何快速找到志同道合的人?看这一篇就够了
如何快速找到志同道合的人?看这一篇就够了 一.前言 参加工作也有挺长一段时间了,一直以来自己也很希望可以真正为自己打拼一片天地,这应该也是大部分中产白领很希望做的事,有些人成功了,有些人在路上,而有些 ...
- api网关选型_如何轻松打造百亿流量API网关?看这一篇就够了(下)
如何轻松打造百亿流量API网关?看这一篇就够了(上) 上篇整体描述了网关的背景,涉及职能.分类.定位环节,本篇进入本文的重点,将会具体谈下百亿级流量API网关的演进过程. 准备好瓜子花生小板凳开始积累 ...
- python装饰器功能是冒泡排序怎么做_传说中Python最难理解的点|看这完篇就够了(装饰器)...
https://mp.weixin.qq.com/s/B6pEZLrayqzJfMtLqiAfpQ 1.什么是装饰器 网上有人是这么评价装饰器的,我觉得写的很有趣,比喻的很形象 每个人都有的内裤主要是 ...
最新文章
- javascript全栈开发实践-准备
- Linux下的CST和UTC时间的区别
- IGMP V1 V2 V3 定义和区别
- Linux文件系统只读Read-only file system
- httpd服务的访问控制
- phpstorm 2017.1.3编辑远程项目
- Linux 利用yum源安装subversion(svn)客户端
- java中使用MD5进行计算摘要
- 腾讯企业邮箱报错 smtp.exmail.qq.comport 465, isSSL false
- c# 获取键盘的输入
- 常用c语言函数实现,常用的C语言库函数实现
- Mac使用技巧:在“快速查看”中查看和编辑文件
- 打单软件显示服务器错误是怎么回事,网络版仓库进销存,出入库存管理软件,送货单打印等连接不上解决【新版】...
- 用 C#.NET 编写的一个完整字谜游戏
- 测试人员的职业规划 --整理标注
- tableau 字段去重_Tableau
- 【STM32学习笔记】(5)—— STM32工程添加源文件和头文件
- android搜索网站,加速 Android的 五大开源网站 codekk.com
- PL-VIO(点线slam)学习笔记(持续更新)
- 串口调试助手C++源代码 可接收发送串口数据 带接收Echo回环到发送的功能