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处理图像,掌握均值滤波器和加权均值滤波器的使用,对比两种滤波器对图像处理结果及系统自带函数和自定义函数性能的比较,体会不同大小的掩模对图像细节的影响 ...
随机推荐
- db2日志模式、备份归档、恢复解析
DB2的日志分为两种模式,日志循环与归档日志,也就是非归档和归档模式.下面就具体介绍一下这两种方式以及和备份归档设置的关系. 一.日志循环 这是默认方式,也就是非归档模式,这种模式只支持(backup ...
- python25day
内容回顾 面向对象的回顾 类 对象 怎么用 怎么继承 pickle模块 今日内容 继承(进阶的知识点) 经典类和新式类 python3所有类都继承object类 所有继承object的类都是新式类 不 ...
- 合宙AIR105使用Keil MDK + DAP-Link 烧录和调试
关于AIR105 AIR105是合宙LuatOS生态下的一款芯片, 1月初上市, 开发板与摄像头一起搭售(赠送). 从配置信息看, 芯片性能相当不错: Cortex-M4F内核, 最高频率204Mhz ...
- Jquery Validate 使用记坑
在使用jquery validate 的时候 使用的有remote 需要在页面初始化的时候调用, 这样在文本框输入完的时候就会调用远程方法验证,否则,在最后表单验证的时候会忽悠remote的返回值验证 ...
- opencvsharp 根据row方向和面积筛选连通域的两种方式
ConnectedComponents cc = Cv2.ConnectedComponentsEx(tempMat);//相当于halcon的connection获取全部连通域 int blobnu ...
- IOS scrollView 图片浏览
// // ViewController.m // 0426 // // Created by apple on 15/4/26. // Copyright (c) 2015年 gense. All ...
- WebGPU 中的缓冲映射机制
1. 什么是缓冲映射 就不给定义了,直接简单的说,映射(Mapping)后的某块显存,就能被 CPU 访问. 三大图形 API(D3D12.Vulkan.Metal)的 Buffer(指显存)映射后, ...
- 编译安装haproxy
一.安装lua环境 1.1 安装依赖包 [root@centos7 ~]# yum install gcc readline-devel 1.2 下线lua源码包并解压 [root@centos7 ~ ...
- opencv笔记--SURF
SURF(Speeded-Up Robust Features) 是对 SIFT 得改进,相对于 SIFT,SURF 利用积分图像与盒函数模拟 DoG,提升了计算速度:同时,使用了一种不用于 SIFT ...
- Solution -「SHOI2016」「洛谷 P4336」黑暗前的幻想乡
\(\mathcal{Description}\) link. 有一个 \(n\) 个结点的无向图,给定 \(n-1\) 组边集,求从每组边集选出恰一条边最终构成树的方案树.对 \(10^9+ ...