01_opencv_python_基本图像处理
1 图像基本操作
1.0.1 环境配置地址:
Anaconda:https://www.anaconda.com/download/
Python_whl:https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv
1.1 数据读取-图像
- cv2.IMREAD_COLOR:彩色图像
- cv2.IMREAD_GRAYSCALE:灰度图像
import cv2 # opencv读取的格式是BGR
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
# img读入的本质上就是数组
img = cv2.imread('cat.jpg')
#图像的显示,也可以创建多个窗口
cv2.imshow('image',img)
# 等待时间,毫秒级,0表示任意键终止
cv2.waitKey(0)
cv2.destroyAllWindows()
我们来将上述图像显示的代码封装成一个函数
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们可以看看图像的各种基本信息
print(img.shape) # 图片形状(h, w, c) # 读取灰度图 -->通道数 c == 1
img=cv2.imread('cat.jpg',cv2.IMREAD_GRAYSCALE)
img # 看看图片的类型 numpy.ndarray
type(img) # 图片的size = h * w * c
img.size # 图片中数据的类型 比如uint8 float32
img.dtype
保存图片
# ('路径/保存图片名字', 要保存的图片)
cv2.imwrite('mycat.png', img)
1.2 数据读取-视频
- cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。
- 如果是视频文件,直接指定好路径即可。
vc = cv2.VideoCapture('test.mp4')
# 检查是否打开正确
if vc.isOpened():
oepn, frame = vc.read()
else:
open = False
while open:
ret, frame = vc.read()
if frame is None:
break
if ret == True:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('result', gray)
if cv2.waitKey(100) & 0xFF == 27:
break
vc.release()
cv2.destroyAllWindows()
1.3 录制视频
import cv2#导入opencv包 video=cv2.VideoCapture(0)#打开摄像头 fourcc = cv2.VideoWriter_fourcc(*'XVID')#视频存储的格式
fps = video.get(cv2.CAP_PROP_FPS)#帧率
#视频的宽高
size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), \
int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))
out = cv2.VideoWriter('video.avi', fourcc, fps, size)#视频存储 while out.isOpened():
ret,img=video.read()#开始使用摄像头读数据,返回ret为true,img为读的图像
if ret is False:#ret为false则关闭
exit()
cv2.namedWindow('video',cv2.WINDOW_AUTOSIZE)#创建一个名为video的窗口
cv2.imshow('video',img)#将捕捉到的图像在video窗口显示
out.write(img)#将捕捉到的图像存储
#按esc键退出程序
if cv2.waitKey(1) & 0xFF ==27:
video.release()#关闭摄像头
break
1.4 截取部分图像数据
img=cv2.imread('cat.jpg')
cat=img[0:100,0:200]
cv_show('cat',cat)
1.5 色彩空间API
def color_space_demo(src):
img = cv2.imread(src)
# 转成灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv_show("gray", gray)
# 转成HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv_show('hsv', hsv)
# hsv转成rgb(bgr)
img = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
cv_show('hcv2img', img)
# yuv...也可以转
1.5.1 基于颜色提出目标(先转成hsv格式)


def extrace_object_demo(src):
img = cv2.imread(src) # 通道数是3
# print(img.shape)
img_binary = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 通道数是 1
# print(img_binary.shape) # 1.将RGB转换成HSV色彩空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# print(hsv.shape) # 2.定义数组,说明你要提取(过滤)的颜色目标
# 三通道,所以是三个参数
# 红色
lower_hsv_r = np.array([156, 43, 46])
upper_hsv_r = np.array([180, 255, 255]) # 3.进行过滤,提取,得到二值图像
mask_red = cv2.inRange(hsv, lower_hsv_r, upper_hsv_r) # 通道数是 1
# print(mask_red.shape) # 4.展示成果
cv_show('original', img)
cv_show('mask_red', mask_red) # 5.合并展示
res = np.hstack((img_binary, mask_red))
cv_show("hastck", res) return mask_red
1.6 颜色通道提取与合并
# 提取
b,g,r=cv2.split(img)
print(b.shape)
# 合并
img = cv2.merge((b,g,r))
print(img.shape)
# 只保留R
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,1] = 0
cv_show('R',cur_img)
1.7 边界填充
- BORDER_REPLICATE:复制法,也就是复制最边缘像素。
- BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
- 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(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0)
import matplotlib.pyplot as plt
plt.subplot(231), plt.imshow(img, 'gray'), plt.title('ORIGINAL')
plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')
plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT')
plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT_101')
plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')
plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT') plt.show()

1.8 图像融合
必须保证要融合的图片shape一致
img_cat=cv2.imread('cat.jpg')
img_dog=cv2.imread('dog.jpg')
img_cat + img_dog
# ValueError: operands could not be broadcast together with shapes (414,500,3) (429,499,3)
# 将狗狗的图片和猫猫的图片resize一样
img_dog = cv2.resize(img_dog, (500, 414))
# 选择融合的权重
res = cv2.addWeighted(img_cat, 0.4, img_dog, 0.6, 0)
# 展示结果
plt.imshow(res)

进一步演示resize的用法
# 将猫猫的图片放大
res = cv2.resize(img, (0, 0), fx=4, fy=4)
plt.imshow(res)

res = cv2.resize(img, (0, 0), fx=1, fy=3)
plt.imshow(res)

01_opencv_python_基本图像处理的更多相关文章
- Atitit 图像处理和计算机视觉的分类 三部分 图像处理 图像分析 计算机视觉
Atitit 图像处理和计算机视觉的分类 三部分 图像处理 图像分析 计算机视觉 1.1. 按照当前流行的分类方法,可以分为以下三部分:三部分 图像处理 图像分析 计算机视觉1 1.2. 图像处理需要 ...
- Atitit 图像处理的摩西五经attilax总结
Atitit 图像处理的摩西五经attilax总结 1. 数字图像处理(第三版)1 2. 图像处理基础(第2版)(世界著名计算机教材精选)1 3. 计算机视觉特征提取与图像处理(第三版)2 4. Op ...
- Atitit 图像处理的心得与疑惑 attilax总结
Atitit 图像处理的心得与疑惑 attilax总结 1.1. 使用类库好不好??还是自己实现算法1 1.2. 但是,如果遇到类库体积太大,后者没有合适的算法,那就只能自己开发算法了1 1.3. 如 ...
- Atitit 图像处理 调用opencv 通过java api attilax总结
Atitit 图像处理 调用opencv 通过java api attilax总结 1.1. Opencv java api的支持 opencv2.4.2 就有了对java api的支持1 1. ...
- Atitit MATLAB 图像处理 经典书籍attilax总结
Atitit MATLAB 图像处理 经典书籍attilax总结 1.1. MATLAB数字图像处理1 1.2. <MATLAB实用教程(第二版)>((美)穆尔 著)[简介_书评_在线阅读 ...
- Atitit 图像处理类库大总结attilax qc20
Atitit 图像处理类库大总结attilax qc20 1.1. 选择与组合不同的图像处理类库1 1.2. Halcon 貌似商业工具,功能强大.1 1.3. Openvc Openvc功能也是比 ...
- Atitit MATLAB 图像处理attilax总结
Atitit MATLAB 图像处理attilax总结 1.1. 下载 Matlab7.0官方下载_Matlab2012 v7.0 官方简体中文版-办公软件-系统大全.html1 1.2. Matla ...
- 使用MATLAB对图像处理的几种方法(下)
试验报告 一.试验原理: 图像点处理是图像处理系列的基础,主要用于让我们熟悉Matlab图像处理的编程环境.灰度线性变换和灰度拉伸是对像素灰度值的变换操作,直方图是对像素灰度值的统计,直方图均衡是对 ...
- 使用MATLAB对图像处理的几种方法(上)
实验一图像的滤波处理 一.实验目的 使用MATLAB处理图像,掌握均值滤波器和加权均值滤波器的使用,对比两种滤波器对图像处理结果及系统自带函数和自定义函数性能的比较,体会不同大小的掩模对图像细节的影响 ...
随机推荐
- 如何在pyqt中使用 QStyle 重绘 QSlider
前言 使用 qss 可以很方便地改变 QSlider 的样式,但是有些情况下 qss 无法满足我们的需求.比如下图所示样式: 如果直接使用 qss 将 handle 的内圆设置为透明背景,会看到 ha ...
- atomic 原子自增工程用法案例
案例 1 : 简单用法 atomic_int id; atomic_fetch_add(&id, 1) atomic_uint id; atomic_fetch_add(&id, 1) ...
- 双系统之删除Linux以及grub的引导
问题阐述:最近玩双系统,把linux系统搞崩了,回到windos备份Linux系统的数据就把Linux的盘格式化了,然后再每当进入系统都会出现grub的命令格的窗口,输入任何命令都报错? 解决方法: ...
- java实现跳过证书校验
/** * 跳过证书效验的sslcontext * @return * @throws Exception */ private static SSLContext createIgnoreVerif ...
- Java 中的锁原理、锁优化、CAS、AQS 详解!(转)
1.为什么要用锁? 锁-是为了解决并发操作引起的脏读.数据不一致的问题. 2.锁实现的基本原理 2.1.volatile Java编程语言允许线程访问共享变量, 为了确保共享变量能被准确和一致地更新, ...
- Lua非常有用的工具——递归打印表数据
摘要: Lua是一种非常小巧的语言.虽小,但五脏俱全. 在Lua中,我认为最最核心的数据结构就是表.表不仅可用作数组,还可以用作字典.Lua面向对象的实现也是用表实现的. 表对于Lua实在是太重要了! ...
- get方式和post方式的区别
1.请求的URL地址不同: post:"http://192.168.13.83:8080/itheima74/servlet/LoginServlet" ...
- mysql表查询、多表查询(增强查询的使用)子查询、合并查询,外连接,mysql5种约束,自增长
一.查询加强 1.在mysql中,日期类型可以直接比较,需要注意格式 2.%:表示0到多个字符, _:表示单个字符 exp:显示第二个字符为大写O的所有员工的姓名和工资 select name fr ...
- 【BZOJ3545】Peaks(Kruskal重构树 主席树)
题目链接 大意 给出有\(N\)个点\(M\)条边的一张图,其中每个点都有一个High值,每条边都有一个Hard值. 再给出\(Q\)个询问:\(v\) \(x\) \(k\) 每次询问查询从点\(v ...
- 【CF888G】Xor-MST(生成树 Trie)
题目链接 大意 给出\(N\)个点的点权,定义两个点之间的边权为这两个点权的异或和,求这\(N\)个点间的最小生成树. 思路 贪心地想,相连的两个点异或和应当尽量的小. 那么应先从高位确定,因为高位的 ...