因为最近公司项目需要用到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之图片处理看这一篇就够了(一)相关推荐

  1. Android Studio制作.9图片,看这一篇就够了

    一..9.png图片概念 这是安卓开发里面的一种特殊的图片 这种格式的图片在android 环境下具有自适应调节大小的能力,不会失真 (1)允许开发人员定义可扩展区域,当需要延伸图片以填充比图片本身更 ...

  2. 1盒子刷Armbian,看这一篇就够了——Armbian全方位安装指导书

    N1盒子刷Armbian,看这一篇就够了--Armbian全方位安装指导书 2020-03-30 19:04:11 72点赞 715收藏 122评论 创作立场声明:一个写完之后很累很累的年轻人 追加修 ...

  3. 2019-5-25-win10-uwp-win2d-入门-看这一篇就够了

    title author date CreateTime categories win10 uwp win2d 入门 看这一篇就够了 lindexi 2019-5-25 20:0:52 +0800 2 ...

  4. 大厂面试爱问的HashMap死锁问题,看这一篇就够了

    大厂面试爱问的HashMap死锁问题,看这一篇就够了 JDK 1.7 HashMap源码分析 put()方法 addEntry()方法 resize()方法 transfer()方法(重点) 死锁演示 ...

  5. 技术交底书怎么撰写?看这一篇就够了

    文章目录 技术交底书怎么撰写?看这一篇就够了 专利技术交底书格式 1. 发明(或实用新型 以下同)的名称 2. 技术领域 3. 背景技术 4. 发明内容 5. 附图说明 6. 具体实施方式 技术交底书 ...

  6. 17万字 JUC 看这一篇就够了(三) (精华)

    今天我们继续来学习Java并发编程 Juc框架 ,把剩余部分学习完 17万字 JUC 看这一篇就够了(一) (精华) 17万字 JUC 看这一篇就够了(二) (精华) 文章目录 非公原理 加锁 解锁 ...

  7. VR模式全景图的实现看这一篇就够了

    VR模式全景图的实现看这一篇就够了 在搞VR之前一直是个小白,写下这篇博客也只是记录下我们的这些天走过的坎.给真正想玩转全景图的朋友一些参考建议,由于在这方面还是一个新手,还请前辈多指教. 所需软件 ...

  8. 如何快速找到志同道合的人?看这一篇就够了

    如何快速找到志同道合的人?看这一篇就够了 一.前言 参加工作也有挺长一段时间了,一直以来自己也很希望可以真正为自己打拼一片天地,这应该也是大部分中产白领很希望做的事,有些人成功了,有些人在路上,而有些 ...

  9. api网关选型_如何轻松打造百亿流量API网关?看这一篇就够了(下)

    如何轻松打造百亿流量API网关?看这一篇就够了(上) 上篇整体描述了网关的背景,涉及职能.分类.定位环节,本篇进入本文的重点,将会具体谈下百亿级流量API网关的演进过程. 准备好瓜子花生小板凳开始积累 ...

  10. python装饰器功能是冒泡排序怎么做_传说中Python最难理解的点|看这完篇就够了(装饰器)...

    https://mp.weixin.qq.com/s/B6pEZLrayqzJfMtLqiAfpQ 1.什么是装饰器 网上有人是这么评价装饰器的,我觉得写的很有趣,比喻的很形象 每个人都有的内裤主要是 ...

最新文章

  1. javascript全栈开发实践-准备
  2. Linux下的CST和UTC时间的区别
  3. IGMP V1 V2 V3 定义和区别
  4. Linux文件系统只读Read-only file system
  5. httpd服务的访问控制
  6. phpstorm 2017.1.3编辑远程项目
  7. Linux 利用yum源安装subversion(svn)客户端
  8. java中使用MD5进行计算摘要
  9. 腾讯企业邮箱报错 smtp.exmail.qq.comport 465, isSSL false
  10. c# 获取键盘的输入
  11. 常用c语言函数实现,常用的C语言库函数实现
  12. Mac使用技巧:在“快速查看”中查看和编辑文件
  13. 打单软件显示服务器错误是怎么回事,网络版仓库进销存,出入库存管理软件,送货单打印等连接不上解决【新版】...
  14. 用 C#.NET 编写的一个完整字谜游戏
  15. 测试人员的职业规划 --整理标注
  16. tableau 字段去重_Tableau
  17. 【STM32学习笔记】(5)—— STM32工程添加源文件和头文件
  18. android搜索网站,加速 Android的 五大开源网站 codekk.com
  19. PL-VIO(点线slam)学习笔记(持续更新)
  20. 串口调试助手C++源代码 可接收发送串口数据 带接收Echo回环到发送的功能

热门文章

  1. css字体倾斜角度_css如何设置字体倾斜样式
  2. idea设置主题路径
  3. 我的世界光影mod怎么用_《我的世界》RTX beta 版视频体验:仿佛打破了次元壁
  4. 华为NP课程笔记8-BGP2
  5. 只要学会这个PDF压缩方法,压缩PDF不再是难题
  6. Abaqus相关报错合集
  7. oracle分析函数详解
  8. 一网打尽 SCI、SCIE、SSCI 、EI等指标及影响因子查询
  9. 微信小程序架构图与开发
  10. 《游戏设计艺术(第2版)》——学习笔记(15)第15章 玩家通过界面玩游戏