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

【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.xdnf.cn/news/510355.html

相关文章:

  • MLLM常见概念通俗解析(一)
  • 【基于Spring Boot 的图书购买系统】深度讲解 用户注册的前后端交互,Mapper操作MySQL数据库进行用户持久化
  • 如何利用内网穿透实现Cursor对私有化部署大模型的跨网络访问实践
  • 【图像生成大模型】CogVideoX-5b:开启文本到视频生成的新纪元
  • lvs-dr部署
  • c++学习之--- list
  • C语言链表的操作
  • 数字人技术的核心:AI与动作捕捉的双引擎驱动(210)
  • defer关键字:延迟调用机制-《Go语言实战指南》
  • 8.1UDP点对点聊天小项目
  • 软件架构之--论微服务的开发方法1
  • 软件工程各种图总结
  • 数据库MySQL基础2
  • 【回溯 剪支 状态压缩】# P10419 [蓝桥杯 2023 国 A] 01 游戏|普及+
  • Java大厂面试:从Web框架到微服务技术的场景化提问与解析
  • FAST-DDS源码分析PDP(一)
  • NoSQL实战指南:MongoDB与Redis企业级开发实战
  • Vue 3 动态 ref 的使用方式(表格)
  • 【Linux高级全栈开发】2.1.3 http服务器的实现
  • AI:NLP 情感分析
  • Filament引擎(一) ——渲染框架设计
  • 中级网络工程师知识点7
  • 课外活动:需了解的海象运算符(:=)
  • HTTPS的工作过程
  • 低延迟与高性能的技术优势解析:SmartPlayer VS VLC Media Player
  • 贪心、分治和回溯算法
  • 当AI自我纠错:一个简单的“Wait“提示如何让模型思考更深、推理更强
  • MySQL(21)如何查询表中的所有数据?
  • ffmpeg -vf subtitles添加字幕绝对路径问题的解决方法
  • 吴恩达机器学习(1)——机器学习算法分类