利用python进行图像视觉基础练习

2023-10-26

练习内容为:

1. 对于图像进行均值滤波和中值滤波;
2. 对于图像的第二个波段,进行灰度图自适应均衡化,输出为单波段影像;
3. 对于图像的第三个波段进行阈值处理和自适应阈值处理,输出为单波段影像;
4. 对于图像先进行二值化,再进行两种形态学处理。开运算:表示的是先进行腐蚀,再进行膨胀操作;闭运算:表示先进行膨胀操作,再进行腐蚀操作;输出均为单波段影像;
5. 对于图像进行90°、270°翻转,镜像翻转,垂直翻转。
6. 对于图像进行傅里叶变换,将图像时域转换成频域;
7. 对于图像进行傅里叶逆变换,将图像频域变成时域;

练习数据自行选择一张图片。

以上练习的内容均比较基础,此次的练习难度较小,可以用来加深对于图像视觉基础内容的了解。下面为练习基础知识和代码演示。

1. 对于图像进行均值滤波和中值滤波

参考文章Python+OpenCV图像处理:均值滤波、中值滤波、高斯滤波以及图像堆叠显示_nicec1的博客-CSDN博客

中值滤波是一种非线性的信号处理方法,所以它是一种非线性滤波器,也是一种统计排序滤波器。它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。

均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。

实现代码如下:

import cv2

# 导入图像
image = cv2.imread('【图片路径】')


# 图像显示
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 均值滤波
blur = cv2.blur(image, (3, 3))

# 保存均值滤波结果
cv2.imwrite('【保存路径】' + 'blur.jpg', blur)

# 中值滤波
median = cv2.medianBlur(image, 5)

# 保存
cv2.imwrite('【保存路径】' + 'median.jpg', median)

中值滤波结果

均值滤波结果

 2. 对于图像的第二个波段,进行灰度图自适应均衡化,输出为单波段影像

此题说明要将图像的第二波段进行实验,故要先提取出图像的RGB通道的灰度图,此处用split函数,具体参考【数字图像处理实验二】:RGB图3个通道的提取、RGB图转灰度图、图片反转、图片亮度调整、直方图显示_Stick_2的博客-CSDN博客_rgb三个通道

opencv的读取顺序是BGR,代码如下

import cv2

# 导入图像
image = cv2.imread('【图片路径】', 1)
(b, g, r) = cv2.split(image)

cv2.imwrite('【保存路径】' + 'B.jpg', b)
cv2.imwrite('【保存路径】' + 'G.jpg', g)
cv2.imwrite('【保存路径】' + 'G.jpg', r)

读取结果:

再对第二波段进行自适应均衡化

“直方图均衡化”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在更广泛灰度范围内的分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。

这种方法提高图像整体的对比度,特别是有用数据的像素值分布比较接近时,在X光图像中使用广泛,可以提高骨架结构的显示,另外在曝光过度或不足的图像中可以更好的突出细节。

此篇文章有直方图自适应均衡化的具体讲解此处选择用简单的equalizeHist函数进行处理

二、opencv图像处理_nootele的博客-CSDN博客_opencv图像处理

# 灰度图均衡化
equ = cv2.equalizeHist(g)
# 保存
cv2.imwrite('【保存位置】' + 'equ.jpg', equ)

均衡化结果:

3. 对于图像的第三个波段进行阈值处理和自适应阈值处理,输出为单波段影像

阈值处理和自适应阈值处理的手段和方法很多,图像阈值化(Binarization)旨在剔除掉图像中一些低于或高于一定值的像素,从而提取图像中的物体,将图像的背景和噪声区分开来。

具体内容参考[Python从零到壹] 四十六.图像增强及运算篇之图像阈值化处理_Eastmount的博客-CSDN博客_python图片阈值化

【Python学习蝴蝶书】第五章 图像处理10-自适应阈值 - 知乎

在做这部分的处理时要求对第三个波段进行阈值处理,在这两篇文章中都是先将图像进行灰度化处理

#灰度图像处理
grayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)

 此处的所用的第三波段的图像已经就是灰度图,若但是不进行此步灰度图像处理代码会报错

图像灰度处理是将一幅彩色图像转换为灰度化图像的过程。彩色图像通常包括R、G、B三个分量,分别显示出红绿蓝等各种颜色,灰度化就是使彩色图像的R、G、B三个分量相等的过程。我的理解是此处要将第三波段的灰度值填充到其他的两个波段中,否则其他两个波段的值为空无法进行均衡化。

具体代码如下:

先进行阈值化,选择二进制阈值化,阈值为127

在这里插入图片描述

import cv2
import numpy as np

# 导入图像
R = cv2.imread('【图像路径】')

# 阈值化
R, thr = cv2.threshold(R, 127, 255, cv2.THRESH_BINARY)

cv2.imwrite('D:/py/images/' + 'thr.jpg', thr)

再进行自适应阈值处理,自适应阈值化有两种常用的算法ADAPTIVE_THRESH_MEAN_C(阈值取邻域的平均值) 或 ADAPTIVE_THRESH_GAUSSIAN_C(阈值取自邻域的加权和平均值,权重分布为一个高斯函数分布),此处选择ADAPTIVE_THRESH_MEAN_C展示

代码如下:

import cv2
import numpy as np

# 导入图像
R = cv2.imread('【图片路径】')
# 图片灰度化处理
gray = cv2.cvtColor(R, cv2.COLOR_BGR2GRAY)

# 均值阈值化
thr1 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 3, 2)

# 保存
cv2.imwrite('【保存路径】' + 'thr1.jpg', thr1)

阈值化结果:

自适应阈值化结果:

 4. 对于图像先进行二值化,再进行两种形态学处理。开运算:表示的是先进行腐蚀,再进行膨胀操作;闭运算:表示先进行膨胀操作,再进行腐蚀操作;输出均为单波段影像

图像的二值是将图像上的像素点的“灰度值”设置为[0, 0, 0]或[255, 255, 255],即要么纯黑,要么纯白。图像的二值化有全局阈值法、自适应阈值法、OTSU二值化等具体参考一下两篇文章Python图像的二值化_不羁少年!的博客-CSDN博客_python 二值化

Python实现图片二值化_陈壮实的编程生活的博客-CSDN博客_python图像二值化

形态学转换是基于图像形状的一些简单操作。它通常在二进制图像上执行。腐蚀和膨胀是两个基本的形态学运算符。然后它的变体形式如开运算,闭运算,礼帽黑帽等。

腐蚀和膨胀是最基本的形态学操作,腐蚀和膨胀都是针对白色部分(高亮部分)而言的。所以这部分的操作的对象是灰度图

膨胀就是使图像中高亮部分扩张,效果图拥有比原图更大的高亮区域;腐蚀是原图中的高亮区域被蚕食,效果图拥有比原图更小的高亮区域。膨胀是求局部最大值的操作,腐蚀是求局部最小值的操作。具体内容参考下面这篇文章形态学操作部分

二、opencv图像处理_nootele的博客-CSDN博客_opencv图像处理

具体代码如下:

先进行图像的二值化

import cv2

def binary(image):
    grayimage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    ret, binary_image = cv2.threshold(grayimage, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
    return binary_image


image_r = cv2.imread('D:/py/images/R.jpg')
image_g = cv2.imread('D:/py/images/G.jpg')
image_b = cv2.imread('D:/py/images/B.jpg')

cv2.imwrite('D:/py/image_1/' + 'binary_r.jpg', binary(image_r))
cv2.imwrite('D:/py/image_1/' + 'binary_g.jpg', binary(image_g))
cv2.imwrite('D:/py/image_1/' + 'binary_b.jpg', binary(image_b))

在进行开运算和闭运算

# 开运算以B通道举例
b = cv2. imread('【图片路径】', cv2.IMREAD_UNCHANGED)

# 设置卷积核
kernel_b = np.ones((5, 5), np.uint8)

# 图像开运算
open_b = cv2.morphologyEx(b, cv2.MORPH_OPEN, kernel_b)

# 保存
cv2.imwrite('【保存路径】' + 'open_b.jpg', open_b)
# 闭运算以G通道举例
g = cv2. imread('【图片路径】', cv2.IMREAD_UNCHANGED)

# 设置卷积核
kernel_g = np.ones((5, 5), np.uint8)

# 图像开运算
close_g = cv2.morphologyEx(g, cv2.MORPH_CLOSE, kernel_g)

cv2.imwrite('【保存路径】' + 'close_g.jpg', close_g)

二值化结果:

开运算结果:

 

闭运算结果:

 

 (以上结果均为部分举例,实际情况为RGB每一个各有一张二值化,开运算和闭运算结果)

5. 对于图像进行90°、270°翻转,镜像翻转,垂直翻转

图像的翻转比较容易理解,网上的讲解也很多,具体代码如下:

import os
from PIL import Image

path = r'【图片路径】'

# 90°, 270° 翻转
for i in os.listdir(path):
    image = Image.open(os.path.join(path, i))
    image270 = image.transpose(Image.ROTATE_270)   # 旋转270度
    image270.save('【保存位置】/{}_{}.jpg'.format(i.split('.')[0], '270'))
    
image90 = image.transpose(Image.ROTATE_90)     # 旋转90度
    image90.save('【保存路径】/{}_{}.jpg'.format(i.split('.')[0], '90'))

# 上下翻转,镜面翻转
image = Image.open('【图片路径】')
image.transpose(Image.FLIP_TOP_BOTTOM).save('【保存路径】')
image.transpose(Image.FLIP_LEFT_RIGHT).save('【保存路径】')


6. 对于图像进行傅里叶变换,将图像时域转换成频域

7. 对于图像进行傅里叶逆变换,将图像频域变成时域

图像的傅里叶变换是将图像的灰度分布函数变换为图像的频率分布函数,傅立叶逆变换是将图像的频率分布函数变换为灰度分布函数。具体内容参考以下文章,推荐学习第二篇中的傅里叶变换公式的代码实现,此处直接引用opencv库函数Python图像处理笔记——傅里叶变换_霜晨月、的博客-CSDN博客_python对图像傅里叶变换

opencv-python傅里叶变换以及逆变换_猪头少年@的博客-CSDN博客_python傅里叶逆变换

傅里叶分析之掐死教程(完整版)更新于2014.06.06 - 知乎

具体代码如下:

首先进行傅里叶变换

import cv2
import numpy as np

image = cv2.imread("【图片路径】", 0)

# 傅里叶变换
dft = np.fft.fft2(image)
dftshift = np.fft.fftshift(dft)     # 将低频部分移动到图像中间
result = 20 * np.log(np.abs(dftshift))
cv2.imwrite('【保存路径】' + 'fuliye.jpg', result)

再进行傅里叶逆变换

import cv2
import numpy as np

image = cv2.imread("【图片路径】", 0)

# 傅里叶变换
dft = np.fft.fft2(image)
dftshift = np.fft.fftshift(dft)     # 将低频部分移动到图像中间
result = 20 * np.log(np.abs(dftshift))

# 逆傅里叶变换
ishift = np.fft.ifftshift(dftshift)
iImage = np.fft.ifft2(ishift)
iImage = np.abs(iImage)
cv2.imwrite('【保存路径】' + 'ifft.jpg', iImage)

傅里叶变换结果为:

 逆傅里叶变换结果为:

总结:

以上为此次练习实验的全部内容。目前的学习仍处在模仿阶段,大部分代码是通过查阅得到,暂时没有能力做到自主写出代码解决问题。新人小白暑假自学python,以上内容中如有疑问或错误,还请各位路过的大佬举出,万分感谢!!! 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用python进行图像视觉基础练习 的相关文章

随机推荐

  • Spring Cloud五大组件

    Spring Cloud五大组件 Spring Cloud是分布式微服务架构的一站式解决方案 在Spring Boot基础上能够轻松搭建微服务系统的架构 现有Spring Cloud有两代实现 一代 Spring Cloud Netflix
  • SpringBoot(一)使用itelliJ社区版创建SpringBoot项目

    工欲善其事 必先利其器 要开发SpringBoot项目 首先就是选择一款合适的开发工具 目前市面上有很多优秀的开发工具 例如 IntelliJ IDEA Visual Studio Code 和 Eclipse 等 那么我们该如何选择呢 最
  • 17 Redis缓存更新策略(缓存和数据库更新选择)

    1 先更新数据库 在更新缓存 会有异常 更新完Mysql 发生异常 redis还没有更新 导致redis的是旧数据 下次读取缓存读的是脏数据 2 先删除缓存 在更新数据库 1 缓存已经删了 mysql还在更新中 由于Mysql还在更新中 会
  • java类注释_Java注释,java类注释详解

    一个程序的可读性 关键点就在于注释 下面要给大家讲到的就是Java注释方面的知识 主要会介绍java类注释 类注释一般必须放在所有的 import 语句之后 类定义之前 主要声明该类可以做什么 以及创建者 创建日期 版本和包名等一些信息 下
  • VS2022编译调试FFmpeg

    Git 工具下载 安装直接选择好安装路径 直接下一步到安装完成 配置好工程目录 msvc为编译生成的目标文件的目录 source为源代码目录 进入source目录 通过Git下载FFmpeg git clone https github c
  • 设计模式(三)——装饰模式

    往期地址 设计模式 一 简单工厂模式 设计模式 二 策略模式 本期主题 讲解装饰模式 装饰模式 1 什么是装饰模式 2 实例 2 1 场景 2 2 代码 1 什么是装饰模式 装饰模式是一种结构型设计模式 可以把对象的特殊行为进行封装 从而为
  • ue4单选框设置

    奇怪的是 ue4只有多选框 原来合并了 Style FCoreStyle Get RadioButton 不多说了 放代码 先枚举几个 enum ERadioChoice Radio0 Radio1 Radio2 SHorizontalBo
  • steps_per_epoch=2000,epochs=100之间的区别

    第一种解释 batchsize 中文翻译为批大小 批尺寸 在深度学习中 一般采用SGD训练 即每次训练在训练集中取batchsize个样本训练 iteration 中文翻译为迭代 1个iteration等于使用batchsize个样本训练一
  • 小程序

    文章目录 新建项目并梳理项目结构 配置导航栏效果 配置 tabBar 效果 实现轮播图效果 获取轮播图数据 渲染轮播图页面效果 对轮播图进行美化 实现九宫格效果 获取九宫格数据 渲染九宫格布局 美化九宫格布局 实现图片布局 上拉触底案例 定
  • Lua判断一个对象是否为空,包含userdata

    Lua判断一个对象是否为空 客户端在开发游戏的时候 经常会遇到一个问题 C 传递过来的GameObject已经被销毁了 但是lua这边判断却不是nil 而是一个userdata 那怎么判断一个userdata是否为空呢 可以使用如下代码判断
  • SSH密码暴力破解

    SSH密码暴力破解 1 Hydra 海德拉 hydra 是世界顶级密码暴力密码破解工具 支持几乎所有协议的在线密码破解 功能强大 其密码能否被破解关键取决于破解字典是否足够强大 在网络安全渗透过程中是一款必备的测试工具 1 1指定用户破解
  • 数据结构自考

    设带头结点的单向循环链表的头指针为变量head 则空循环链表的判定条件是 head gt next head 一个具有n个顶点的无向完全图的边数为 n n 1 2 设某有向图有n个顶点 则改有向图对应的邻接表中的表头节点个数为n 若查找每个
  • 使用freemarker生成静态html文件

    一 引入依赖
  • 如何在家里赚钱,分享六个适合普通人长期可做的副业

    当今社会 压力越来越大 工作 家庭 生活等等 方方面面都需要钱 仅靠一份工作赚钱 已经很难满足我们的需求 所以越来越多的人尝试做副业 通过副业增加收入 让生活过得更幸福 常见的副业都是业余学一项技能 通过这项技能来赚钱 这是最保险的副业方式
  • 获取磁盘信息并扫描是否连接移动磁盘之JS版

    昨天弄了一天 扫描U盘是否连接到电脑 的功能 折腾了一天出了个java版和js版 这里记录下JS版本 先说说思路 从浏览器的地址栏打开网页之后 通过onload事件调用ActiveXObject判断U盘是否连接到电脑 若是连接了获取信息显示
  • 数论 费马小定理+快速幂取模

    D Sum Time Limit 1000MS Memory Limit 131072KB 64bit IO Format I64d I64u Submit Status Description Input 2 Output 2 Hint
  • 商用服务器性能,安全与性能兼顾的商用服务器推荐

    数据作为企业生存之本 如果没有好的商用服务器为其安全性保驾护航 企业就会变成无本之木 而在众多商用服务器推荐中 能将稳定性能 快速处理 高安全性等优点集一身的当属全球销量独占鳌头的戴尔14代PowerEdge服务器 作为现代化数据中心的基石
  • 关于“使用rand()产生的随机数每次得到的结果相同”的问题

    之前使用rand 产生随机数出现了一个怪问题 一直没能理解 初次出现的随机数数列是1111 5556 3543 6434 3245 再次运行 产生的结果仍然是1111 5556 3543 6434 3245 再运行 仍然是1111 5556
  • apt命令

    在基于 Debian 的 Linux 发行版中 有各种工具可以与 APT 进行交互 以方便用户安装 删除和管理的软件包 apt get 便是其中一款广受欢迎的命令行工具 另外一款较为流行的是 Aptitude 这一命令行与 GUI 兼顾的小
  • 利用python进行图像视觉基础练习

    练习内容为 1 对于图像进行均值滤波和中值滤波 2 对于图像的第二个波段 进行灰度图自适应均衡化 输出为单波段影像 3 对于图像的第三个波段进行阈值处理和自适应阈值处理 输出为单波段影像 4 对于图像先进行二值化 再进行两种形态学处理 开运