目录
一、图像几何变化
1、对图片进行放大、缩小、水平放大和垂直放大
2、旋转、缩放、控制画布大小
二、图像形态学处理
1、梯度运算
2、闭运算
3、礼帽运算
4、黑帽运算
三、图像阈值分割
1、二值化处理
2、反二值化处理
3、截断阈值处理
4、超阈值零处理
5、低阈值零处理
6、自适应阈值处理
7、Otsu处理
四、图像处理基础
1、感兴趣区域的提取
2、人脸部分进行脱敏处理
一、图像几何变化
我们以lena图片作为素材
1、对图片进行放大、缩小、水平放大和垂直放大
import cv2
import numpy as np
'''1、将lena_color.jpg 放大到600*600
2、将lena_color.jgp 缩小到50*50
3、将lena_color.jgp 在水平方向放大到2位,垂直方向放大到1.5倍
4、将以上所有图像进行显示。'''
img = cv2.imread('project_demo/class_picture/lena_color.jpg')
img1 = cv2.resize(img, (600, 600))
img2 = cv2.resize(img, (50, 50))
img3 = cv2.resize(img, (0, 0), fx=2, fy=1.5)
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
2、旋转、缩放、控制画布大小
'''
将lena_color.jpg
a、以图像中心为旋转中心,顺时针旋转60度,
b、图像缩小为原来的0.4,
c、画布大小为原始图像大小。
再将图像进行平移至原始图像的(0,0)->变换后图像的(50,25)
'''
from tkinter import W
import cv2
import numpy as np
# 读取图像
img = cv2.imread('project_demo/class_picture/lena_color.jpg')
# 图像旋转
h, w = img.shape[:2] # 获取图像的宽高
M = cv2.getRotationMatrix2D((w / 2, h / 2), -60, scale=0.4) # 获取旋转矩阵
rotated1 = cv2.warpAffine(img, M, (w, h)) # 进行旋转
cv2.imshow('rotated1', rotated1)
# 图像平移
src = np.float32([[0, 0], [0, w-1], [h-1, 0]]) # 获取原始图像的三个点
dst = np.float32([[50, 25], [50, w + 25], [h + 50, 25]]) # 获取变换后的三个点
M2 = cv2.getAffineTransform(src, dst) # 获取仿射变换矩阵
rotated2 = cv2.warpAffine(rotated1, M2, (w, h)) # 进行仿射变换
cv2.imshow('rotated2', rotated2)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果图:
二、图像形态学处理
1、梯度运算
import cv2
import numpy as np
# 形态学梯度运算
image = cv2.imread('project_demo/class_picture/gradient.bmp')
kernel = np.ones((3, 3), np.uint8)
gradient_image = cv2.morphologyEx(image, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('Original Image', image)
cv2.imshow('Gradient Image', gradient_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
2、闭运算
image = cv2.imread('project_demo/class_picture/gradient.bmp')
kernel = np.ones((3, 3), np.uint8)
closing_image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
cv2.imshow('Original Image', image)
cv2.imshow('Closing Image', closing_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
3、礼帽运算
image = cv2.imread('project_demo/class_picture/lena.bmp')
image2 = cv2.imread('project_demo/class_picture/gradient.bmp')
kernel = np.ones((3, 3), np.uint8)
tophat_image = cv2.morphologyEx(image, cv2.MORPH_TOPHAT, kernel)
tophat_image2 = cv2.morphologyEx(image2, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('Original Image', image)
cv2.imshow('Top Hat Image', tophat_image)
cv2.imshow('Original Image2', image2)
cv2.imshow('Top Hat Image2', tophat_image2)
cv2.waitKey(0)
cv2.destroyAllWindows()
4、黑帽运算
image = cv2.imread('project_demo/class_picture/lena.bmp')
image2 = cv2.imread('project_demo/class_picture/gradient.bmp')
kernel = np.ones((3, 3), np.uint8)
blackhat_image = cv2.morphologyEx(image, cv2.MORPH_BLACKHAT, kernel)
blackhat_image2 = cv2.morphologyEx(image2, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('Original Image', image)
cv2.imshow('Black Hat Image', blackhat_image)
cv2.imshow('Original Image2', image2)
cv2.imshow('Black Hat Image2', blackhat_image2)
cv2.waitKey(0)
cv2.destroyAllWindows()
三、图像阈值分割
1、二值化处理
import numpy as np
img = cv2.imread('project_demo/class_picture/lena_gray.jpg')
# 二进制阈值化,设阈值127
retval, dst = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
2、反二值化处理
# 反二进制阈值化,设阈值127
retval, dst = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
3、截断阈值处理
retval, dst = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
4、超阈值零处理
# 超阈值化零处理,设阈值127
retval, dst = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
5、低阈值零处理
# 低阈值零处理,设阈值127
retval, dst = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
6、自适应阈值处理
# 自适应阈值处理
dst = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
7、Otsu处理
# Otsu处理
retval, dst = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
四、图像处理基础
1、感兴趣区域的提取
步骤:
① 读取一张图像,如果成功读取,则显示该图像,如果读取失败,则显示“The file is not exist”
② 读取图像
③ 对兴趣区域提取
'''
对兴趣区域提取
1.读取一张图像,如果成功读取,则显示该图像,如果读取失败,则显示“The file is not exist”
2.读取图像
3.对兴趣区域提取
'''
import cv2
import matplotlib.pyplot as plt
def show_plt():
iamge_path = 'project_demo/class_picture/kongfu_panda.jpg'
image = plt.imread(iamge_path)
plt.imshow(image)
plt.axis('off')
plt.show()
def main():
img = cv2.imread('project_demo/class_picture/kongfu_panda.jpg')
if img is None:
print('The file is not exist')
else:
# 提取兴趣区域
img1 = img[70:325, 48:221]
img2 = img[83:471, 377:592]
img3 = img[259:481, 621:737]
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
show_plt()
main()
2、人脸部分进行脱敏处理
'''
对海报的人脸部分进行脱敏处理
'''
import cv2
import matplotlib.pyplot as plt
import numpy as np
def show_plt():
iamge_path = 'project_demo/class_picture/kongfu_panda.jpg'
image = plt.imread(iamge_path)
plt.imshow(image)
plt.axis('off')
plt.show()
def main():
img = cv2.imread('project_demo/class_picture/police_story.png')
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.resizeWindow('image', 500, 500)
if img is None:
print('The file is not exist')
else:
face = np.random.randint(0, 255, (600, 445, 3))
img[50:650, 364:809, :] = face
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
#show_plt
main()