【OpenCV基础 1】几何变换、形态学处理、阈值分割、区域提取和脱敏处理

目录

一、图像几何变化

1、对图片进行放大、缩小、水平放大和垂直放大

2、旋转、缩放、控制画布大小

二、图像形态学处理

1、梯度运算

2、闭运算

3、礼帽运算

4、黑帽运算

三、图像阈值分割

1、二值化处理

2、反二值化处理

3、截断阈值处理

4、超阈值零处理

5、低阈值零处理

6、自适应阈值处理

7、Otsu处理

四、图像处理基础

1、感兴趣区域的提取

2、人脸部分进行脱敏处理


一、图像几何变化

我们以lena图片作为素材

1、对图片进行放大、缩小、水平放大和垂直放大

python 复制代码
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、旋转、缩放、控制画布大小

python 复制代码
'''
将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、梯度运算

python 复制代码
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、闭运算

python 复制代码
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、礼帽运算

python 复制代码
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、黑帽运算

python 复制代码
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、二值化处理

python 复制代码
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、反二值化处理

python 复制代码
# 反二进制阈值化,设阈值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、截断阈值处理

python 复制代码
retval, dst = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

4、超阈值零处理

python 复制代码
# 超阈值化零处理,设阈值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、低阈值零处理

python 复制代码
# 低阈值零处理,设阈值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、自适应阈值处理

python 复制代码
# 自适应阈值处理
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处理

python 复制代码
# 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"

② 读取图像

③ 对兴趣区域提取

python 复制代码
'''
对兴趣区域提取
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、人脸部分进行脱敏处理

python 复制代码
'''
对海报的人脸部分进行脱敏处理

'''
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()
相关推荐
企鹅的企32 分钟前
2027北京AI健康科技与智慧医疗展官方精准邀约进行中
人工智能·科技
高德诚33 分钟前
探索桌面智能的无限可能:小小舵机,撑起 AI 仿生交互的完整未来
人工智能
2601_9563198837 分钟前
2026年零基础学量化:从看懂示例到写清条件和动作
人工智能·python
ArkAPI42 分钟前
Claude Code 连发安全修复:AI 编程 Agent 的权限,正在成为新的“安全事故高发区”
人工智能·大模型·api·codex·ai工具·claude code·arkapi
Thecozzy43 分钟前
大厂 AI Coding 面试大招
人工智能·面试·职场和发展
维核科技1 小时前
推理加速实战:投机解码与KV Cache优化让大模型“快起来“
人工智能
数智化管理手记1 小时前
海量数据如何沉淀有效数据资产?数据标准化治理方案如何搭建?
java·大数据·人工智能
过期的秋刀鱼!1 小时前
LangChain-D1-模型的工作流程
人工智能·python·langchain
科技象限1 小时前
数智落地提速:2026下半年传统行业智能化升级爆发场景预判
人工智能