###################################### ~~1.存读图像~~ ###########

主要包含图像的读取、存储、图片模式的转换、格式的转换。

#导入cv模块
import cv2 as cv

读取一张400x600分辨率的图像

color_img = cv.imread(‘img/src_1000x1000.jpg’)

直接读取单通道灰度图

gray_img = cv.imread(‘img/src_1000x1000.jpg’, cv.IMREAD_GRAYSCALE)
灰度图:
每个像素点只能有一个值表示颜色,它的像素值在0到255之间,0是黑色,255是白色,中间值是一些不同等级的灰色,可以说灰度是黑与白之间的过渡色!

注意这个值不是RGB里的任何一个元素,显示设备是直接通过CRT(彩色阴极射线显像管)将单通道里的像素值显示黑白色图像,值越高黑色图越亮,一般灰度值大小不会超过125!

(把单通道图片保存后,再读取,仍然是3通道,相当于把单通道值复制到3个通道保存)

###################

cv2.IMWRITE_JPEG_QUALITY指定jpg质量,范围0到100,默认95,越高画质越好,文件越大

cv.imwrite(‘img/test_imwrite.jpg’, color_img, (cv.IMWRITE_JPEG_QUALITY, 80))

cv2.IMWRITE_PNG_COMPRESSION指定png质量,范围0到9,默认3,越高文件越小,画质越差

cv.imwrite(‘img/test_imwrite.png’, color_img, (cv.IMWRITE_PNG_COMPRESSION, 5))

·

#####################################***2.缩放,裁剪和补边 ***##############

主要包括图片大小缩放(比例缩放、按指定值缩放)、局部裁剪、周边补色

#导入cv模块
import cv2 as cv

读取一张原始图片

img = cv.imread(‘img/src_1000x1000.jpg’)

缩放成200x200的方形图像

img_200x200 = cv.resize(img, (200, 200))

不直接指定缩放后大小,通过fx和fy指定缩放比例,0.5则长宽都为原来一半

等效于img_100x100 = cv2.resize(img, (100, 100)),注意指定大小的格式是(宽度,高度)

插值方法默认是cv2.INTER_LINEAR,这里指定为最近邻插值

img_100x100 = cv.resize(img_200x200, (0, 0), fx=0.5, fy=0.5,interpolation=cv.INTER_NEAREST)

补充:

最临近插值:即将每一个原像素原封不动地复制映射到扩展后对应多个像素中。这种方法在放大图像的同时保留了所有的原图像的所有信息。在传统图像插值算法中,最临近像素插值较简单,容易实现,早期的时候应用比较普遍。但是,该方法会在新图像中产生明显的锯齿边缘和马赛克现象。

双线性插值:双线性插值法具有平滑功能,能有效地克服最临近像素插值的不足,但会退化图像的高频部分,使图像细节变模糊。

高阶插值:在放大倍数比较高时,高阶插值,如双三次插值和三次样条插值等比低阶插值效果好

在上张图片的基础上,上下各贴50像素的黑边,生成200x100的图像

img_200x100 = cv.copyMakeBorder(img_100x100, 50, 50, 0, 0,cv.BORDER_CONSTANT,value=(0, 0, 0))

对照片中局部进行剪裁

patch_img = img[220:550, -180:-50]
cv.imwrite(‘img/cropped_img.jpg’, patch_img)

cv.imwrite(‘img/resized_200x200.jpg’, img_200x200)
cv.imwrite(‘img/resized_100x100.jpg’, img_100x100)
cv.imwrite(‘img/bordered_200x100.jpg’, img_200x100)

**

################################ 3.色调,明暗,直方图和Gamma曲线####################

**
主要包含色度、饱和度、明暗的条件。

色调是决定一个像素点中的颜色更偏向于哪一方(RGB)
饱和度决定了颜色空间中颜色分量,饱和度越高,说明颜色越深,饱和度越低,说明颜色越浅!
亮度决定颜色空间中颜色的明暗程度!

import cv2 as cv
img = cv.imread(‘img/src_1000x1000.jpg’)

通过cv2.cvtColor把图像从BGR转换到HSV

img_hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
HSV:

H空间中,绿色比黄色的值高一点,所以给每个像素+15,黄色的树叶就会变绿

turn_green_hsv = img_hsv.copy()
turn_green_hsv[:, :, 0] = (turn_green_hsv[:, :, 0]+15) % 180
turn_green_img = cv.cvtColor(turn_green_hsv, cv.COLOR_HSV2BGR)
cv.imwrite(‘img/turn_green.jpg’, turn_green_img)

减小饱和度会让图像损失鲜艳,变得更灰

colorless_hsv = img_hsv.copy()
colorless_hsv[:, :, 1] = 0.5 * colorless_hsv[:, :, 1]
colorless_img = cv.cvtColor(colorless_hsv, cv.COLOR_HSV2BGR)
cv.imwrite(‘img/colorless.jpg’, colorless_img)

减小明度为原来一半

darker_hsv = img_hsv.copy()
darker_hsv[:, :, 2] = 0.5 * darker_hsv[:, :, 2]
darker_img = cv.cvtColor(darker_hsv, cv.COLOR_HSV2BGR)
cv.imwrite(‘img/darker.jpg’, darker_img)


############################# ***

4.图像的仿射变换

***###############################


主要包括缩放、旋转、剪切、翻转、平移,以及他们之间的组合

import cv2 as cv
import numpy as np

读取一张原始照片

img = cv.imread(‘img/src_400x600.jpg’)

沿着横纵轴放大1.6倍,然后平移(-150,-240),最后沿原图大小截取,等效于裁剪并放大

M_crop_elephant = np.array([
[1.6, 0, -150],
[0, 1.6, -240]
], dtype=np.float32)

img_elephant = cv.warpAffine(img, M_crop_elephant, (400, 600))
cv.imwrite(‘img/lanka_elephant.jpg’, img_elephant)

x轴的剪切变换,角度15°

theta = 15 * np.pi / 180
M_shear = np.array([
[1, np.tan(theta), 0],
[0, 1, 0]
], dtype=np.float32)

img_sheared = cv.warpAffine(img, M_shear, (400, 600))
cv.imwrite(‘img/lanka_safari_sheared.jpg’, img_sheared)

顺时针旋转,角度15°

M_rotate = np.array([
[np.cos(theta), -np.sin(theta), 0],
[np.sin(theta), np.cos(theta), 0]
], dtype=np.float32)

img_rotated = cv.warpAffine(img, M_rotate, (400, 600))
cv.imwrite(‘img/lanka_safari_rotated.jpg’, img_rotated)

某种变换,具体旋转+缩放+旋转组合可以通过SVD分解理解

M = np.array([
[1, 1.5, -400],
[0.5, 2, -100]
], dtype=np.float32)

img_transformed = cv.warpAffine(img, M, (400, 600))
cv.imwrite(‘img/lanka_safari_transformed.jpg’, img_transformed)


############################# 5.基本绘图###########


可以在画面上绘制线段,圆,矩形和多边形等,还可以在图像上指定位置打印文字
import cv2 as cv
import numpy as np

可以在画面上绘制线段,圆,矩形和多边形等,还可以在图像上指定位置打印文字

import numpy as np
import cv2

定义一块宽600,高400的画布,初始化为白色

canvas = np.zeros((400, 600, 3), dtype=np.uint8) + 255

画一条纵向的正中央的黑色分界线

cv2.line(canvas, (300, 0), (300, 399), (0, 0, 0), 2)

画一条右半部份画面以150为界的横向分界线

cv2.line(canvas, (300, 149), (599, 149), (0, 0, 0), 2)

左半部分的右下角画个红色的圆

cv2.circle(canvas, (200, 300), 75, (0, 0, 255), 5)

左半部分的左下角画个蓝色的矩形

cv2.rectangle(canvas, (20, 240), (100, 360), (255, 0, 0), thickness=3)

定义两个三角形,并执行内部绿色填充

triangles = np.array([
[(200, 240), (145, 333), (255, 333)],
[(60, 180), (20, 237), (100, 237)]])
cv2.fillPoly(canvas, triangles, (0, 255, 0))

画一个黄色五角星

第一步通过旋转角度的办法求出五个顶点

phi = 4 * np.pi / 5
rotations = [[[np.cos(i * phi), -np.sin(i * phi)], [i * np.sin(phi), np.cos(i * phi)]] for i in range(1, 5)]
pentagram = np.array([[[[0, -1]] + [np.dot(m, (0, -1)) for m in rotations]]], dtype=np.float)

定义缩放倍数和平移向量把五角星画在左半部分画面的上方

pentagram = np.round(pentagram * 80 + np.array([160, 120])).astype(np.int)

将5个顶点作为多边形顶点连线,得到五角星

cv2.polylines(canvas, pentagram, True, (0, 255, 255), 9)

按像素为间隔从左至右在画面右半部份的上方画出HSV空间的色调连续变化

for x in range(302, 600):
color_pixel = np.array([[[round(180*float(x-302)/298), 255, 255]]], dtype=np.uint8)
line_color = [int© for c in cv2.cvtColor(color_pixel, cv2.COLOR_HSV2BGR)[0][0]]
cv2.line(canvas, (x, 0), (x, 147), line_color)

如果定义圆的线宽大于半斤,则等效于画圆点,随机在画面右下角的框内生成坐标

np.random.seed(42)
n_pts = 30
pts_x = np.random.randint(310, 590, n_pts)
pts_y = np.random.randint(160, 390, n_pts)
pts = zip(pts_x, pts_y)

画出每个点,颜色随机

for pt in pts:
pt_color = [int© for c in np.random.randint(0, 255, 3)]
cv2.circle(canvas, pt, 3, pt_color, 5)

在左半部分最上方打印文字

cv2.putText(canvas,
‘打印的文字just english’,
(5, 15),
cv2.FONT_HERSHEY_SIMPLEX,
0.5,
(0, 0, 0),
1)

cv2.imshow(‘窗口名称’, canvas)
cv2.waitKey()


############################## 相机功能###########


一个是VideoCapture,用于获取相机设备并捕获图像和视频,或是从文件中捕获。还有一个VideoWriter,用于生成视频。

下面的代码会根据电脑摄像头捕捉到的信息,在img文件夹下生成一个save.avi的视频文件。
import time
import cv2
import os
import sys

interval = 1 # 捕获图像的间隔,单位:秒
num_frames = 50 # 捕获图像的总帧数
out_fps = 24 # 输出文件的帧率

VideoCapture(0)表示打开默认的相机

cap = cv2.VideoCapture(0)

获取捕获的分辨率

size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))

设置要保存视频的编码,分辨率和帧率

video = cv2.VideoWriter(
“img/save.avi”,
cv2.VideoWriter_fourcc(‘M’, ‘P’, ‘4’, ‘2’), # 视频编码格式参考 http://www.fourcc.org/codecs.php
out_fps,
size
)

对于一些低画质的摄像头,前面的帧可能不稳定,略过

for i in range(42):
cap.read()

开始捕获,通过read()函数获取捕获的帧

try:
for i in range(num_frames):
_, frame = cap.read()
video.write(frame)

    # 如果希望把每一帧也存成文件,比如制作GIF,则允许下面的代码运行# filename = '{:0>6d}.png'.format(i)# cv2.imwrite(filename, frame)print('Frame {} is captured.'.format(i))time.sleep(interval)

except KeyboardInterrupt:
# 捕获提前停止。方便后面使已经捕获好的部分视频可以顺利生成
print(‘Stopped! {}/{} frames captured!’.format(i, num_frames))

释放资源并写入视频文件

video.release()
cap.release()


#################################### 视频文件功能##########


间隔读取视频文件中的每帧的图片
frame_path=“img/frames” # 存放视频截图的文件夹路径

第二个输入参数是设定每隔多少帧截取一帧

frame_interval = 1

if not os.path.exists(frame_path):
os.mkdir(frame_path)

初始化一个VideoCapture对象

cap = cv2.VideoCapture()

filepath = “img/save.avi”

VideoCapture::open函数可以从文件获取视频

cap.open(filepath)

获取视频帧数

n_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print(n_frames)

同样为了避免视频头几帧质量低下,黑屏或者无关等

for i in range(2):
cap.read()

for i in range(2,n_frames): # 读取后面的帧数据
ret, frame = cap.read()
# 每隔frame_interval帧进行一次截屏操作
if i % frame_interval == 0:
imagepath = frame_path+’/video_test’+ str(i)+".jpg"
print(‘导出 {}!’.format(imagepath))
cv2.imwrite(imagepath, frame)

执行结束释放资源

cap.release()


######################### 滤波##############################





cv2.waitKey(0)
cv2.destroyAllWindows()




中高斯滤波应用最为广泛,几乎所有图像的预处理操作都会使用这个。中值滤波能够非常好的去除椒盐噪声。双边滤波用于人物磨皮、人物脸型卡通化等操作。



median = cv2.medianBlur(result, 5)

dst = cv2.GaussianBlur(src, (15,15), 0) #高斯模糊



#######################PCA图像主成分分析######################
python接口

参考博客:
https://blog.csdn.net/wsp_1138886114/article/details/82872838
https://blog.csdn.net/bjbz_cxy/article/details/79701006

超全opencv常见图像处理操作总结及效果展示(附python代码)相关推荐

  1. JavaCV入门指南:调用opencv原生API和JavaCV是如何封装了opencv的图像处理操作?

    JavaCV入门指南系列: JavaCV入门指南:序章(看完本章后,不想看原理的小伙伴可直接跳转到<快速上手篇>) JavaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装 ...

  2. OpenCV与图像处理学习八——图像边缘提取(Canny检测代码)

    OpenCV与图像处理学习八--图像边缘提取(Canny检测代码) 一.图像梯度 1.1 梯度 1.2 图像梯度 二.梯度图与梯度算子 2.1模板卷积 2.2 梯度图 2.3 梯度算子 2.3.1 R ...

  3. OpenCV与图像处理学习十四——SIFT特征(含代码)

    OpenCV与图像处理学习十四--SIFT特征(含代码) 一.SIFT算法 二.SIFT实现过程 三.代码实现 一.SIFT算法 SIFT, 即尺度不变特征变换算法(Scale-invariant f ...

  4. OpenCV图像无缝融合-seamlessClone介绍与使用(附Python/C++源码)

    导读 本期将介绍并演示OpenCV使用seamlessClone实现图像无缝融合效果. 介绍 seamlessClone是OpenCV3后添加的函数,使用此函数可以轻松将一幅图像中的指定目标复制后粘贴 ...

  5. 数据包络分析(超效率-SBM模型)附python代码

    超效率-SBM模型 超效率SBM python代码(部分) 这段时间差不多忙完了,终于有时间可以来经营我的博客了. 上阵子挺多人私信我,原谅我记性不好,可能没有回复全. 这篇文章是超效率的扩展. 超效 ...

  6. python数据标准化代码_可能是最全的数据标准化教程(附python代码)

    什么是数据标准化(归一化) 数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,当各指标间的水平相差很大时,如果直接用原始指标值进行分析,就会突出数值较高的指标 ...

  7. 【超全】一文详解机器学习特征工程(附代码)

    特征工程是使用专业背景知识和技巧处理数据,使得特征值(自变量)能在机器学习算法上发挥更好的作用的过程.python的sklearn库,对于特征工程的处理提供了强大的接口. 在本文中,我将详细介绍特征工 ...

  8. OpenCV 机器视觉入门精选 100 题(附 Python 代码)

    点击上方"AI有道",选择"星标"公众号 重磅干货,第一时间送达 如今深度学习的快速发展给计算机视觉注入了前所未有的新活力!其中在计算机图形学和计算机视觉里面最 ...

  9. c++ string 删除字符_字符串操作的全面总结(附完整代码)

    字符串操作看似简单,其实非常重要,不注意的话,经常出现代码运行结果和自己想要的不一致,甚至崩溃.本文总结了一些构建string对象方法.修改string对象的方法.string类型的操作函数.stri ...

  10. 【使用OpenCV进行视频人脸检测】------机器学习(附完整代码和数据集)

    上篇文章介绍了OpenCV进行照片人脸检测,今天学习的是OpenCV进行视频人脸检测,所有的参考博文.文献.视频.代码都会在文末附上链接或文件压缩包. 本文的目录如下: 内容目录 一.Opencv 进 ...

最新文章

  1. Android开发学习笔记:WebView 一
  2. MAT之ACA:利用ACA解决TSP优化最佳路径问题
  3. uwsgi和nginx的故事
  4. notepad快捷键大全
  5. Share Favorites
  6. VB中什么是类,类模块有什么作用
  7. eclipse和maven
  8. 图解HTTPS协议加密解密全过程
  9. 线性代数 --- 带有置换矩阵P的LU分解
  10. word毕业论文页眉设置自动添加章节标题并左右对齐
  11. 有些梦想任时光侵袭也无法忘记,社科院杜兰金融管理硕士项目助你圆梦
  12. IP地址、网络地址、网关的作用
  13. 今天安利几个实用的APP给你
  14. CSS预处理器之Sass与Less
  15. 量子计算 11 NSA的随机数阴谋
  16. Ubuntu20.04|最新一版的深度学习基础环境安装指导
  17. phoenix的元数据一般存在哪里_【Python基础】hive的元数据存在哪里
  18. 人类感知决策的神经生理学
  19. VR沉浸式消防安全演练综合解决方案
  20. 爱普生打印机维修资料大全

热门文章

  1. 开发利器--JSONVIEW插件 网页json数据直接转换
  2. java横向分割面板后怎么加标签_java面板,标签,布局问题代码执行
  3. EMNLP2020文档级关系抽取模型GAIN 论文Double Graph Based Reasoning for Document-level Relation Extraction
  4. JavaSE学习--HTML
  5. 官宣|Apache Flink 1.14.0 发布公告
  6. 一线城市的繁荣vs年轻人的梦想?
  7. 计算机开机无法定位,开机提示无法定位程序输入点...于动态链接库CommFunc.dll上...
  8. java窗口全屏_java如何改全屏为窗口?求啊啊啊啊
  9. pythonsubprocess执行多条shell命令_Python获取shell管道数据/输入的2种方法: subprocess子进程 ......
  10. go代码--数据结构