OpenCV图像处理学习笔记-Day1
OpenCV图像处理学习笔记-Day1
第1课:图像读入、显示和保存
1. 读入图像
retval = cv2.imread(文件名[,显示控制参数])
文件名:完整文件名
参数:
cv2.IMREAD_UNCHANGED
cv2.IMREAD_GRAYSCALE
cv2.IMREAD_COLOR
2. 显示图像
None = cv2.imshow(窗口名, 图像名)
范例:
cv2.imshow('demo', image)
retval = cv2.waitKey( [,delay])
delay:
delay > 0 等待delay毫秒
delay < 0 等待键盘单击
delay = 0 无线等待
cv2.destroyAllWindows() # 销毁所有窗口
3. 保存图像
retval = cv2.imwrite(文件地址, 文件名)
范例:
cv2.imwrite('./image/A.jpg')
第2课:图像处理入门基础
1. 基本概念
图像是由像素构成的
图像分类:
- 二值图像
- 灰度图像
- RGB图像
二值图像的像素点只能是0,1
灰度图像的像素点是0-255,0为纯黑,255为纯白,区间内都是灰色
RGB图像(3通道,在OpenCV为BGR)
RGB图像的构成可以理解为三个灰度图像拼成一个RGB图像。
2. RGB转灰度
在实际项目中,通常需要将原始图像处理为灰度图像。为什么这么做呢?原始的彩色图像其一个像素点有三个值处理数据较为麻烦。而灰度图像每个像素点就只有一个值处理起来较为简单。转为灰度图像是否会丢失图像信息?不会!在转换过程中采取的算法采用加权操作,确保RGB三个颜色都保存在灰度图像中。
第3课:像素处理
1. 读取像素
返回值 = 图像(位置参数)
# 灰度图像,返回灰度值
范例:
p = img[88, 142]
print(p)
# BGR图像,返回B,G,R的值
范例:
blue = img[78, 125, 0]
print(blue)
green = img[78, 125, 1]
print(green)
red = img[78, 125, 2]
print(red)
p = img[78, 125]
print(p) # B, G, R
2. 修改像素
# 灰度图像(numpy数组操作)
范例:
print(img[88, 99])
img[88, 99] = 255
print(img[88, 99])
第4课:使用numpy进行像素操作
1. 读取像素
返回值 = 图像.item(位置参数)
灰度图像,返回灰度值。
BGR图像,返回值为BGR的值
范例:
p = img.item(78, 125)
print(p)
blue = img.item(78, 125, 0)
green = img.item(78, 125, 1)
red = img.item(78, 125, 2)
2. 修改像素
灰度图像
范例:
img.itemset((88, 99), 255)
print(img.item(88, 99))
img.itemset((88, 99), 255)
print(img.item(88, 99))
BGR图像
范例:
img.itemset((88, 99, 0), 255)
img.itemset((88, 99, 1), 255)
img.itemset((88, 99, 2), 255)
第5课:获取图像属性
1. 形状:行、列、通道数
shape可以获取图像的形状,返回包含行数,列数,通道数的元组
灰度:返回行数、列数
彩色:返回行数、列数、通道数
范例:
import cv2
img1 = cv2.imread('灰度图像')
print(img1.shape) # (512, 512)
import cv2
img2 = cv2.imread('彩色图像')
print(img2.shape) # (512,512,3)
2. 像素数目
size可以获取图像的像素数目。
灰度: 返回行数*列数
彩色: 返回行数*列数*通道数
范例:
import cv2
img = cv2.imread('图像名')
print(img.size) # 352353
3. 获取图像类型
dtype返回的是图像的数据类型
范例:
import cv2
img = cv2.imread('图像名称')
print(img.dtype) # uint8
第6课:图像ROI
1. ROI(region of interest),感兴趣区域
import cv2
img = cv2.imread('图像名称')
face = img[200:400, 200:400]
import cv2
img = cv2.imread('图像名称')
face = img[200:400, 200:400]
img[200:400, 600:800] = face
第7课:通道的拆分与合并
1. 拆分通道
import cv2
img = cv2.imread('image_dir')
b = img[:, :, 0]
g = img[:, :, 1]
r = img[:, :, 2]
import cv2
img = cv2.imread('image_dir')
b, g, r = img.split(img) # 拆分通道
cv2.imshow('B', b)
cv2.imshow('G', g)
cv2.imshow('R', r)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 合并通道
import cv2
img = cv2.imread('image_dir')
b, g, r = cv2.split(a)
m = cv2.merge([b, g, r]) # 合并通道
cv2.imshow('merge', m)
cv2.waitKey(0)
cv2.destroyAllWindows()
注意:拆分的顺序与合并的顺序一定要相同,否则图片将要不正确
import cv2
img = cv2.imread('image_dir')
b, g, r = cv2.split(img)
bgr = cv2.merge([b, g, r])
rgb = cv2.merge([r, g, b]) # 产生错误图片
cv2.imshow('bgr', bgr)
cv2.imshow('rgb', rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()
第8课:图像加法
1. numpy加法
2. OpenCV加法
注意的问题
参与运算的图像大小、类型必须一致
3. 代码实例
import cv2
img = cv2.imread('image_dir')
img_ = img
result1 = img + img_
result2 = cv2.add(img, img_)
cv2.imshow('original', img)
cv2.imshow('result1', result1)
cv2.imshow('result2', result2)
cv2.waitKey(0)
cv2.destroyAllWindows()
第9课:图像融合
- 将2张或2张以上的图像信息的融合到1张图像上
- 融合的图像含有更多的信息、能够更方便人来观察或者计算机处理
1. 介绍
图像加法
结果图像 = 图像1 + 图像2
img = img1 + img2
图像融合
结果图像 = 图像1 * 系数1 + 图像2 * 系数2 + 亮度调节量
img = img1 * 0.3 + img2 * 0.7 + 18
2. 代码实现
import cv2
img1 = cv2.imread('image_dir')
img2 = cv2.imread('image_dir')
result = cv2.addWeighted(img1, 1, img2, 1, 0)
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
第10课:类型转换
OpenCV提供了200多种不同的类型转换。
cv2.COLOR_BGR2GRAY
cv2.COLOR_BGR2RGB
cv2.COLOR_GRAY2BGR
import cv2
img = cv2.imread('image_dir')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # BGR转灰度图
img_RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # BGR图像转RGB图像
cv2.imshow('lenaColor', img)
cv2.imshow('lenaGray', img_gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
第11课:图像缩放
1. 图像缩放-resize函数
语法格式
dst = cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
src:原始图像
dsize:缩放大小
b = cv2.resize(a, (122, 122))
fx, fy:缩放大小
b = cv2.resize(a, None, fx=0.5, fy=0.7)
注意dsize; fx, fy设置一个即可
import cv2
img = cv2.imread('image_dir')
rows, cols = img.shape[:2]
img_resized = cv2.resize(img, (200, 100)) # (col, row), (宽, 高)
# cv2.resize(img, (round(cols*0.5), round(rows*1.2)))
# cv2.resize(img, None, fx=1.2, fy=0.5) # (row, col), (高, 宽)
cv2.imshow('original', img)
cv2.imshow('resized', img_resized)
cv2.waitKey(0)
cv2.destroyAllWindows()
第11课:图像翻转
1. 图像翻转-flip函数
语法
dst = cv2.flip(src, flipCode)
范例:
dst = cv2.flip(src, 1)
cv2.flip(a, 0)
OpenCV图像处理学习笔记-Day1的更多相关文章
- OpenCV图像处理学习笔记-Day03
OpenCV图像处理学习笔记-Day03 目录 OpenCV图像处理学习笔记-Day03 第31课:Canny边缘检测原理 第32课:Canny函数及使用 第33课:图像金字塔-理论基础 第34课:p ...
- OpenCV图像处理学习笔记-Day4(完结)
OpenCV图像处理学习笔记-Day4(完结) 第41课:使用OpenCV统计直方图 第42课:绘制OpenCV统计直方图 pass 第43课:使用掩膜的直方图 第44课:掩膜原理及演示 第45课:直 ...
- OpenCV 图像处理学习笔记(一)
解读IplImage结构 typedef struct _IplImage { int nSize; /* IplImage大小 */ int ID; ...
- OpenCV入门学习笔记
OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...
- Android NDK开发及OpenCV初步学习笔记
https://www.jianshu.com/p/c29bb20908da Android NDK开发及OpenCV初步学习笔记 Super_圣代 关注 2017.08.19 00:55* 字数 6 ...
- 播放一个视频并用滚动条控制进度-OpenCV应用学习笔记二
今天我们来做个有趣的程序实现:利用OpenCV读取本地文件夹的视频文件,并且在窗口中创建拖动控制条来显示并且控制视频文件的读取进度. 此程序调试花费了笔者近一天时间,其实大体程序都已经很快写出,结果执 ...
- 数字图像处理学习笔记之一 DIP绪论与MATLAB基础
写在前面的话 数字图像处理系列的学习笔记是作者结合上海大学计算机学院<数字图像处理>课程的学习所做的笔记,使用参考书籍为<冈萨雷斯数字图像处理(第二版)(MATLAB版)>,同 ...
- sqli-labs学习笔记 DAY1
DAY 1 准备工作 安装phpstudy 安装配置sqli-labs 学习笔记 SQL语句的注释:–, # +在URL经过编码后会编码为空格 SQL语句的查询语句:SELECT column_nam ...
- 视频文件写入转换之图像处理-OpenCV应用学习笔记五
在<笔记二>中我们做了视频播放和控制的实现,仅仅算是完成了对视频文件的读取操作:今天我们来一起练习下对视频文件的写入操作:格式转换. 实现功能: 打开一个视频文件play.avi,读取文件 ...
随机推荐
- 封装Vue Element的upload上传组件
本来昨天就想分享封装的这个upload组件,结果刚写了两句话,就被边上的同事给偷窥上了,于是在我全神贯注地写分享的时候他就神不知鬼不觉地突然移动到我身边,腆着脸问我在干啥呢.卧槽你妈,当场就把我吓了一 ...
- Elementor如何隐藏页面上的标题(2种办法)
原文首发于:https://loyseo.com/how-to-hide-page-title-in-elementor/ 本文介绍两种隐藏Elementor页面默认标题的方法,一种是单个隐藏,一种是 ...
- 01.arduino uno开发板入门
01.所需工具 -Ariduino uno开发板一块 -对应的usb数据线 -杜邦线若干 -一些用以测试的电子元器件 02.安装arduino IDE 打开官网链接https://www.arduin ...
- 卡方检验(Chi_square_test): 原理及python实现
概述 What for?主要用在某个变量(或特征)值是不是和应变量有显著关系,换种说法就是看某个变量是否独立 \(X^2=\sum{\frac{(observed-expected)^2}{expec ...
- k8s设置pod运行完自动删除
本环境apiserver.controller还要scheduler都是以pod的形式运行的,修改/etc/kubernetes/manifests下面对应的三个.yaml静态文件,加入 - --fe ...
- guzzle下载图片(laravel+vue)
先再laravel安装guzzle扩展包:composer require guzzlehttp/guzzle 之后再控制器操作: use GuzzleHttp\Client; //远程api数据的获 ...
- Content Security Policy (CSP)内容安全策略总结
跨域脚本攻击 XSS 是最常见.危害最大的网页安全漏洞. 为了防止它们,要采取很多编程措施,非常麻烦.很多人提出,能不能根本上解决问题,浏览器自动禁止外部注入恶意脚本?这就是"网页安全政策& ...
- 网络协议HTTP、TCP/IP、Socket
网络协议HTTP.TCP/IP.Socket 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的 ...
- Prometheus监控神器-服务发现篇(二)
本章节讲解服务发现与Relabelling的机制与范例. 通过服务发现的方式,我们可以在不重启Prometheus服务的情况下动态的发现需要监控的Target实例信息. 如上图所示,对于线上环境我们可 ...
- 2020云栖大会智慧出行专场:聚焦高精地图/算法、智能模型、自动驾驶、AR导航
2020云栖大会将于9月17日-18日在线举行,届时将通过官网为全球科技人带来前沿科技.技术产品.产业应用等领域的系列重要分享. 阿里巴巴高德地图携手合作伙伴精心筹备了“智慧出行”专场.我们将为大 ...