【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()
相关推荐
IT_Octopus25 分钟前
【零基础入门 LLM 开发 · Day 13】:LangChain 的对话记忆——Message 对象版
人工智能·python·langchain
2603_965148111 小时前
社区与学习资源:从入门到精通的API选品学习路径
数据库·人工智能·python·学习·数据挖掘
LiuPig刘皮哥1 小时前
2026年开源3D陪玩对比:xiaoke.ai、AIRI、Open-LLM-VTuber、Amica 有什么、没有什么
人工智能·3d·开源
西柚小萌新1 小时前
【岗位面试】--成都博维数孪 - 工业 AI 解决方案顾问
人工智能·面试·职场和发展
Luminbox紫创测控1 小时前
车载LiDAR强光测试的实验设计方法与数据分析
人工智能·数据挖掘·数据分析·车载系统·安全性测试·太阳光模拟器
建筑工程企业管理系统2 小时前
工程进度统计管理系统自动化汇总数据,解决施工企业手工对账误差难题
大数据·人工智能·自动化
唠点键盘之外的2 小时前
27 存量系统接大模型:旁挂一个 AI 微服务,老架构一行不改
人工智能·微服务·架构
u0111026753 小时前
JPG、PNG、WebP 怎么选?按透明度、体积和使用场景做判断
前端·javascript·vue.js·图像处理·ai作画
kaixin_啊啊3 小时前
【用于更准确 G×E 基因组预测的大规模作物数据集与基于深度学习的多模态融合框架】论文学习
人工智能·深度学习·学习
GOWIN革文品牌咨询3 小时前
工业测量品牌系统化搭建指南:从内容架构到长期治理的全流程
大数据·人工智能·架构