图像处理

opencv学习

ixyread.com/read/ID1631

1、python实现图像左右旋转

2、卷积和相关

可以和信号处理中的卷积对比一下

3、边缘检测、梯度计算

canny

程事在人:Canny边缘检测算法
OpenCV(五)--超细节的Canny原理及算法实现_coco的博客-CSDN博客_canny算法
Canny边缘检测 · OpenCV-Python中文教程 · 看云

图像梯度计算

python opencv学习(六)图像梯度计算

Sobel算子

利用cv2.Sobel()计算图像梯度的细节讲解_ShannonT的博客-CSDN博客_cv2.sobel

4、图像的几何变换

透视变换: blog.csdn.net/weixin_30

5、python 图片resize()方法汇总

opencv中resize参数介绍
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) → dst

interpolation 选项 所用的插值方法
INTER_NEAREST 最近邻插值
INTER_LINEAR 双线性插值(默认设置)
INTER_AREA 使用像素区域关系进行重采样。 它可能是图像抽取的首选方法,因为它会产生无云纹理的结果。 但是当图像缩放时,它类似于INTER_NEAREST方法。
INTER_CUBIC 4x4像素邻域的双三次插值
INTER_LANCZOS4 8x8像素邻域的Lanczos插值

6、python各类图像库读写图片的方式总结

Python各类图像库的图片读写方式总结 - Madcola - 博客园
图片中的float类型和uint8类型:
python:图片的float类型和uint8类型_宁静致远*的博客-CSDN博客

opencv和PIL读取图片都是np.uint8的格式,但是保存的时候cv2.imwrite()可以保存float64的格式,但是PIL只能保存uint的格式,所以需要进行相应的格式转换。

import cv2
fomr PIL import Image
img_c = cv2.imread('0.jpg')
img_p = Image.open('0.jpg')
img_p = np.array('0.jpg')
# 上述两个库读取的格式都是uint8
img_c, img_p = img_c * 100 / 255, img_p * 100 /255
cv2.imwrite('img_c.jpg', img_c)
img_p = Image.fromarray(img_p)
# img_p.save('img_p.jpg') # 会报错,因为格式必须是uint8
img_p = Image.fromarray(img_p.astype(np.uint8))
img_p.save('img_p.jpg')

但是如果直接改成np.uint8格式的话,numpy中的np.uint8()函数是对原数据和0xff相与(和最低2字节数据相与)这就容易导致如果原数据是大于255的,那么在直接使用np.uint8()后,比第八位更大的数据都被截断了,比如数字2000转换为np.uint8的时候就会转换成208,这样的话就会导致数据不准确,所以可以使用cv2.normalize函数,可以设置目标数组的最大值和最小值,然后让原数组等比例的放大或缩小到目标数组,如下面的例子中是将img的所有数字等比例的放大或缩小到0–255范围的数组中,然后再转换一下数据类型

img = cv2.normalize(img, None, 0, 255, cv2.NORM_MINMAX)
img = img.astype(np.uint8)

cv2.normalize使用:
Python cv2.normalize方法代码示例
opencv中归一化函数normalize()的原理讲解_生命在于折腾!-CSDN博客

Python PIL.Image和OpenCV图像格式相互转换

PIL.Image转换成opencv格式:

import cv2
from PIL import Image
import numpy
image = Image.open("1.jpg")
image.show()
img = cv2.cvtColor(numpy.asarray(image),cv2.COLOR_RGB2BGR)
cv2.imshow("OpenCV",img)
cv2.waitKey()

OpenCV转换成PIL.Image格式

import cv2
from PIL import Image
import numpy
img = cv2.imread("1.jpg")
cv2.imshow("OpenCV",img)
image = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
image.show()
cv2.waitKey()

愿逐月华流照君:PyTorch:读取图像的两种方法

7、Python_使用Pillow(PIL)进行图像数据读取&&处理

Python_使用Pillow(PIL)进行图像数据读取&&处理_Rocky6688的博客-CSDN博客_pil读取图片数据

8、OpenCV cv2.putText实现字符串换行'\n'

OpenCV cv2.putText实现字符串换行'\n'

9、opencv中的轮廓检测

cv2.findContours
关于python:如何使用OpenCV检测具有相同颜色的像素区域 | 码农家园

10、opencv中阈值操作

Python-Opencv中阈值化操作和自适应阈值化,二值化操作_wave.lt的博客-CSDN博客

11、腐蚀与膨胀

曲怪曲怪:OpenCV 图像处理之膨胀与腐蚀

12、opencv中HSV

在线RGB转HSV: RGB HSV 转换
颜色空间转换 - 在线工具

HSV介绍: OpenCV---HSV颜色空间介绍 - 云+社区 - 腾讯云

opencv中和SV颜色对照表: opencv 中HSV的颜色值对照表

将图像转化到HSV域后可以清楚的看到颜色位于什么位置,然后结合cv2.inRange()可以找出颜色的位置从而形成一个mask,比如我要找出颜色为绿色的位置,那么根据颜色对照表绿色的H范围是在35-77

img_ori = cv2.imread('1.jpg')
img_ori = cv2.resize(img_ori, (512, 512))
img_hsv = cv2.cvtColor(img_ori, cv2.COLOR_BGR2HSV)
lower = np.array([35, 43, 46], dtype="uint8")
upper = np.array([77, 255, 255], dtype="uint8")
mask = cv2.inRange(img_hsv, lower, upper) # shape:512x512,在lower和upper之间的为255,其余的为0
mask = cv2.cvtColor(mask, cv2.COLOR_GRAY2RGB)
cv2.imwrite('mask.jpg', mask)

13、图像中的插值方法

插值分为最近邻插值、线性插值、双线性插值、双三次插值,如果是三维数据的话还有三线性插值,双的意思指的是这里的数据维度是2,几次插值指的是使用了几阶插值方法,线性插值都是一阶的是线性的。线性插值需要使用 2^1=2 个数据、双线性插值需要使用 2^2=4 个数据、三线性插值需要使用 2^3=8 个数据、双三次插值需要 (1+3)^2=16 个数据、三两次插值需要 (1+2)^3=27 个数据、m维n次插值需要使用 (1+n)^m 个数据,数据的维度越高多项式的次数就会越高,计算就会越复杂。

最近邻插值、双线性插值、双三次插值_CSDN1HAO的博客-CSDN博客_双三次插值
我与插值萍水相逢续(3): 三线性插值(Trilinear Interpolation)原理及使用 zhuanlan.zhihu.com/p/11

14、使用opencv将灰度图转为热图

import cv2
save_img = save_img.astype(np.uint8) # 在转化为热力图之前需要将图片先转化为uint8数据
save_img_heat = cv2.applyColorMap(save_img, cv2.COLORMAP_JET)

内置的OpenCV颜色贴图选择:

但是matplotlib有更大的colormap选择。matplotlib有 hundreds of various colormaps ,允许你 create your own custom color maps ,而OpenCV只有12个可供选择。

15、 Albumentations使用

albumentations是一个图像处理、数据增强一个很好的库 albumentations - albumentations 1.1.0 documentation

github: github.com/albumentatio
api文档: Albumentations Documentation
每个方法的使用: Albumentations Documentation - Full API Reference

最快最好用的数据增强库「albumentations」 一文看懂用法

16、opencv读取字节流图片

参考资料:http://www.voidcn.com/article/p-sabqihis-bry.html
参考资料: https://blog.csdn.net/yang_bingo/article/details/84066217
1、使用cv2
import cv2
import numpy as np
from matplotlib import pyplot as plt
from PIL import Image
img_url = r'C:\Users\xxc\Desktop\capture.png'
with open(img_url, 'rb') as f:
    a = f.read()
# 二进制数据流转np.ndarray [np.uint8: 8位像素]
img = cv2.imdecode(np.frombuffer(a, np.uint8), cv2.IMREAD_COLOR)
# # 将bgr转为rbg
rgb_img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
print(rgb_img)
# np.ndarray转IMAGE
a = Image.fromarray(rgb_img)
print(a)
# 显示图片
a.show()
2、使用io.BytesIO
import io
from PIL import Image
img_url = r'C:\Users\xxc\Desktop\capture.png'
with open(img_url, 'rb') as f:
    a = f.read()
print(type(a))
# 将字节对象转为Byte字节流数据,供Image.open使用
byte_stream = io.BytesIO(a)  
print(type(byte_stream))
roiImg = Image.open(byte_stream)  
# print("灰度图展示")
# image.convert("L").show()
# 图片保存 
roiImg.save(r'C:\Users\xxc\Desktop\save.png')
小结:cv2和io.BytesIO相比,多了一步bgr转rbg,可能使用io.BytesIO更加方便。

opencv读写视频

简单:

import cv2
video_capture = cv2.VideoCapture(video_path)
while True:
    flag, frame = video_capture.read()
    if not flag:
        break
    # do something with frame
video_capture.release()

获取视频信息

import cv2
video_path = r'D:\peppa\Muddy_Puddles.mp4'
video_capture = cv2.VideoCapture(video_path)
frame_num = video_capture.get(cv2.CAP_PROP_FRAME_COUNT) # ==> 总帧数
fps = video_capture.get(cv2.CAP_PROP_FPS)               # ==> 帧率
width = video_capture.get(cv2.CAP_PROP_FRAME_WIDTH)     # ==> 视频宽度
height = video_capture.get(cv2.CAP_PROP_FRAME_HEIGHT)   # ==> 视频高度
pos = video_capture.get(cv2.CAP_PROP_POS_FRAMES)        # ==> 句柄位置
video_capture.set(cv2.CAP_PROP_POS_FRAMES, 1000)        # ==> 设置句柄位置
pos = video_capture.get(cv2.CAP_PROP_POS_FRAMES)        # ==> 此时 pos = 1000.0
video_capture.release()
# 读取指定帧
video_capture = cv2.VideoCapture(video_path)
t2 = time.time()
frame_num = int(video_capture.get(cv2.CAP_PROP_FRAME_COUNT))
for i in range(frame_num):
    video_capture.set(cv2.CAP_PROP_POS_FRAMES, i)
    flag, frame = video_capture.read()
    assert flag
t3 = time.time()
video_capture.release()

blog.csdn.net/bby1987/a
Python-OpenCV 读取和保存视频和解决保存失败的原因分析
python-opencv图像和视频的读取及分解_明之季的博客-程序员ITS401_opencv python 读取视频
OpenCV基础操作_视频读取_孤独的小丑的博客-CSDN博客_opencv读取视频

opencv获取视频信息

睿爸:opencv-python获取视频属性
python3 opencv获取视频的总帧数介绍
Python OpenCV设置摄像头分辨率

opencv获取摄像头

人工智能技术干货:基于OpenCV的视频流处理方法
Python opencv 调用摄像头时设置以MJPG等编码格式获取视频
opencv调用电脑内置摄像头基本操作及相关问题解析_Leo·rover的博客-CSDN博客_opencv 打开笔记本自带的摄像头

opencv 从视频中随机提取图像帧

人间惆怅客:opencv 从视频中随机提取图像帧

17、python数据处理——图片读取速度测试及多核加速

python数据处理--图片读取速度测试及多核加速_wxs1129的博客-CSDN博客_python 读取图片速度

18、opencv读图片Premature end of JPEG file?

可能是文件下载不完整导致的,需要使用cv2.imread然后再imwrite或者直接删除这张图 opencv读图片Premature end of JPEG file?

Image file is truncated( bytes not processed)

可可哒:CV踩坑记Image file is truncated( bytes not processed)

19、使用python将图片下载到本地

import urllib
# 图片链接
url = ''
# 写入文件路径及文件名
filename = ''