话不多述,直接上代码:
import cv2 as cv
image = cv.imread(r'E:\kaggleData\computer_version_Data\test.jpg')
cv.imshow('Image', image)
cv.waitKey(0)
# waitKey()函数的功能是刷新图像,其中参数k单位是毫秒,表示刷新频率。waitKey(0)表示不刷新无限等待
cv.imwrite("new_image.jpg", image)
# shape[0]表示提取图像的宽度,shape[1]表示提取图像的高度,shape[2]表示提取图像的通道数
weight = image.shape[0]
height = image.shape[1]
channels = image.shape[2]
print(height)
print(weight)
print(channels)
# 输出坐标为[10, 10]处的像素值
print(image[10, 10])
# 获取局部图像
patch1 = image[300:500, 300:400]
cv.imshow("patch1", patch1)
cv.waitKey(0)
"""
图像旋转:
(1)获取图像的宽度、高度以及中心点
(2)创建旋转矩阵
(3)getRotationMatrix2D()有三个参数,一个旋转中心,一个是旋转角度,一个是图片缩放尺度1表示保持原图大小
"""
(w, h) = image.shape[:2]
center = (w//2, h/2)
# print(h)
# print(w)
# print(center)
M = cv.getRotationMatrix2D(center, 135, 1.0)
# warpAffine仿射变换,其实就是不同的坐标系的相互转换,用于图像的平移和旋转.
rotated_image = cv.warpAffine(image, M, (w, h))
cv.imshow('rotated_image', rotated_image)
cv.waitKey(0)
"""
图像的缩放,缩放需要进行插值,插值方法很多,这里选择了INTER_AREA进行插值
"""
new_w, new_h = 100, 200
resized_image = cv.resize(image, (new_w, new_h), interpolation=cv.INTER_AREA)
cv.imshow('resized_image', resized_image)
cv.waitKey(0)
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
plt.figure()
plt.subplots(321)
rectangle = np.zeros((100, 100), dtype='uint8')
cv.rectangle(rectangle, (30, 30), (70, 70), 255, -1)
cv.imshow("Rectangle", rectangle)
cv.waitKey(0) # 必须需要指定,不然就会一闪而过
plt.subplots(322)
circle = np.zeros((100, 100), dtype='uint8')
cv.circle(circle, (50, 50), 25, 255, -1)
cv.imshow("Circle", circle)
cv.waitKey(0)
# 交集
bitwiseAnd = cv.bitwise_and(rectangle, circle)
cv.imshow("AND", bitwiseAnd)
cv.waitKey(0)
"""
并集 bitwise_or
异或操作:bitwise_xor
取非操作:bitwise_not
"""
如果你想分类彩色图像的不同通道与融合,分离使用split,融合使用merge
import cv2 as cv
image = cv.imread(r'E:\kaggleData\computer_version_Data\test.jpg')
(B, G, R) = cv.split(image)
merged = cv.merge([B, G, R])
print([R, G, B])
cv.imshow("Red", R)
cv.imshow("Green", G)
cv.imshow("Blue", B)
cv.imshow("Merged", merged)
cv.waitKey(0)
在做项目的过程中,我们常常需要提取一些感兴趣的区域,例如对于人脸识别,我们只需要提取人脸即可,而对于一些其他的区域都是无用区域,因此我们就可以只提取我们感兴趣的区域即可。感兴趣的区域提取利用从cv2.bitwise_and(image. image, mask=mask),前两个参数为原图(也可以不同但是尺寸必须一样),第三个为mask,通过他bitwise_and只关注mask中被打开的区域。
import cv2 as cv
import numpy as np
# 不能含有中文路径
test_image = cv.imread(r'E:\kaggleData\computer_version_Data\test.jpg')
cv.imshow("test_image", test_image)
cv.waitKey(0)
image_shape = test_image.shape[:2]
print(image_shape)
mask = np.zeros(image_shape, dtype='uint8')
# print(mask)
(cx, cy) = (image_shape[1]//2, image_shape[0]//2)
cv.rectangle(mask, (cx-75, cy-75), (cx+75, cy+75), 255, -1)
cv.imshow("Mask", mask)
cv.waitKey(0)
masked = cv.bitwise_and(test_image, test_image, mask=mask)
cv.imshow("Mask Applied to image", masked)
cv.waitKey(0)
颜色空间,主要有RGB,HSV,L*a*b,HSV空间表达比RGB表达更加接近人类对于色彩的认知,而L*a*b更胜一筹。
颜色空间转换主要使用cv2.cvtColor函数,第一个参数是需要-颜色转换的图像,第二个参数是颜色空间转换格式,常用有cv2.COLOR_BGR2GRAY, cv2.COLOR_BGR2HSV等
import cv2 as cv
image = cv.imread(r'E:\kaggleData\computer_version_Data\test.jpg')
cv.imshow("Original", image)
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
cv.imshow("Gray", gray)
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
cv.imshow("HSV", hsv)
lab = cv.cvtColor(image, cv.COLOR_BGR2LAB)
cv.imshow("LAB", lab)
cv.waitKey(0)
简单的说就是图片中像素点的分布,通过统计,可以直观的用曲线表达出那些像素值多哪些少。在RGB空间主要将值域分为4个区间,每个区间代表一个64px,即[0,64), [64,128),[128,192),[192,255]4个区间,然后统计图片中所有像素落在这个4个区间的像素点个数,最后作图展示出来。
Opencv使用cv2.calcHist方式来计算直方图,参数有images、channels、mask、hitSize、ranges。其中图像列表[images]、通道索引channels,比如灰度图为[0],彩色图用[0,1,2];mask参数如果提供,则只计算mask大于0的区域,不实用则传None即可;hitSize针对所统计通道设置区间数,如三通道[8,8,8];ranges为像素点值域,对于RGB为[0,256]
import cv2 as cv
from matplotlib import pyplot as plt
image = cv.imread(r'E:\kaggleData\computer_version_Data\test.jpg')
# 颜色空间转换
gray_image = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
cv.imshow("gray_image", gray_image)
# 颜色直方图统计
plt.figure()
hist = cv.calcHist([gray_image], [0], None, [256], [0, 256])
plt.subplot(221)
plt.plot(hist)
plt.title("Grayscale color histogram")
# 色彩通道分离
B, G, R = cv.split(image)
hist_B = cv.calcHist([B], [0], None, [256], [0, 256])
plt.subplot(222)
plt.plot(hist_B, 'b')
plt.title("B-channel color histogram")
hist_G = cv.calcHist([G], [0], None, [256], [0, 256])
plt.subplot(223)
plt.plot(hist_G, 'g')
plt.title("G-channel color histogram")
hist_R = cv.calcHist([R], [0], None, [256], [0, 256])
plt.subplot(224)
plt.plot(hist_R, 'r')
plt.title("R-channel color histogram")
plt.show()
cv.waitKey(0)
原图 灰度图