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

###################################### ~~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接口
cv2.PCAComputeVar()

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

  • 7
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值