当前位置: 首页 > 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()

相关文章:

  • 2025.5.12-2025.5.18:开始练习英语口语
  • httpx[http2] 和 httpx 的核心区别及使用场景如下
  • 01 Nginx安装及基本配置
  • PostGIS实现矢量数据转栅格数据【ST_AsRaster】
  • pnpm项目内网迁移
  • minicom串口调试助手
  • Linux云计算训练营笔记day10(MySQL数据库)
  • MapReduce-WordCount实现按照value降序排序、字符小写、识别不同标点
  • 计算机科技笔记: 容错计算机设计05 n模冗余系统 TMR 三模冗余系统
  • C++多态与虚函数详解——从入门到精通
  • 编译原理--期末复习
  • 【2025软考高级架构师】——2022年11月份真题与解析
  • 浅入ES5、ES6(ES2015)、ES2023(ES14)版本对比,及使用建议---ES6就够用(个人觉得)
  • Python字符串格式化(一):三种经典格式化方法
  • Filament引擎(一) ——渲染框架设计
  • 宝塔面板部署前后端项目SpringBoot+Vue2
  • 【C语言】字符串函数及其部分模拟实现
  • 【数据结构】2-3-4 单链表的建立
  • 实现菜谱二级联动导航
  • java每日精进 5.18【文件存储】
  • 中美博弈新阶段,这个“热带中国”火了
  • 调查丨永久基本农田沦为垃圾堆场,整改为何成“纸面工程”?
  • 解锁儿时愿望!潘展乐战胜孙杨,全国冠军赛男子400自夺冠
  • 被围观的“英之园”,谁建了潮汕天价违建?
  • 北京韩美林艺术馆党支部书记郭莹病逝,终年40岁
  • 多个“首次”!上市公司重大资产重组新规落地