当前位置: 首页 > article >正文

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

目录

一、图像几何变化

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.jpga、以图像中心为旋转中心,顺时针旋转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 npimg = 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 npdef 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, :] = facecv2.imshow('image', img)cv2.waitKey(0)cv2.destroyAllWindows()
if __name__ == '__main__':#show_pltmain()

http://www.lryc.cn/news/2379289.html

相关文章:

  • CSS- 4.4 固定定位(fixed) 咖啡售卖官网实例
  • 得力标签打印机系统集成方案的技术应用与场景实践
  • 【通用智能体】Playwright:跨浏览器自动化工具
  • SmartETL函数式组件的设计与应用
  • 精准掌控张力动态,重构卷对卷工艺设计
  • LlamaIndex中应用自定义提示词提升回答质量
  • 永磁同步电机公式总结【一】——反电动势、磁链、转矩公式;三项、两项电压方程;坐标表换方程
  • STL - stack 和 queue 及容器适配器模式的介绍
  • windows 安装gdal实现png转tif,以及栅格拼接
  • 量子计算在金融科技中的应用前景
  • OpenAI Chat API 详解:打造智能对话应用的基石
  • JavaScript性能优化实战(12):大型应用性能优化实战案例
  • Socket.IO是什么?适用哪些场景?
  • 深度学习入门:卷积神经网络
  • 【Odoo】Pycharm导入运行Odoo15
  • pytest框架 - 第二集 allure报告
  • pycharm连接github(详细步骤)
  • Android日活(DAU)检测的四大实现方案详解
  • 2021ICPC四川省赛个人补题ABDHKLM
  • oracle linux 95 升级openssh 10 和openssl 3.5 过程记录
  • httpx[http2] 和 httpx 的核心区别及使用场景如下
  • Text models —— BERT,RoBERTa, BERTweet,LLama
  • 【AGI】大模型微调数据集准备
  • 新能源汽车制动系统建模全解析——从理论到工程应用
  • 【Linux驱动】Linux 按键驱动开发指南
  • 湖北理元理律师事务所:债务管理的社会价值探索
  • 【Bluedroid】蓝牙HID DEVICE 报告发送与电源管理源码解析
  • 04、基础入门-SpringBoot官方文档架构
  • 第9章 组件及事件处理
  • 三、高级攻击工具与框架