详解Python+OpenCV实现图像二值化
作者:用余生去守护 发布时间:2022-01-02 13:08:07
标签:Python,OpenCV,图像,二值化
一、图像二值化
1.效果
2.源码
import cv2
import numpy as np
import matplotlib.pyplot as plt
# img = cv2.imread('test.jpg') #这几行是对图像进行降噪处理,但事还存在一些问题。
# dst = cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21)
# plt.subplot(121),plt.imshow(img)
# plt.subplot(122),plt.imshow(dst)
# plt.show()
fn = "cell.png"
if __name__ == '__main__':
print('loading %s' % fn)
img = cv2.imread(fn) #读取图像 修改上方 fn的路径即可
sp = img.shape
print(sp) #在编译结果处显示图片的信息 这行没啥用
# 获取图像大小
sz1 = sp[0] #长
sz2 = sp[1] #宽
print('width:%d\nheight:%d' % (sz2,sz1)) #控制窗口显示的比例
# 创建一个窗口显示图像
cv2.namedWindow('img') #这行没啥用 控制显示图片窗口的名字
cv2.imshow('img',img) #显示图片
# 复制图像矩阵,生成与源图像一样的图像,并显示
myimg2 = img.copy();
cv2.namedWindow('myimg2') #这行没啥用 控制显示图片窗口的名字
cv2.imshow('myimg2',myimg2)
# 复制并转换为灰度化图像并显示
myimg1 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #灰度值函数
cv2.namedWindow('myimg1')
cv2.imshow('myimg1',myimg1) #显示灰度处理后的函数
cv2.imwrite('gray.jpg', myimg1) #保存当前灰度值处理过后的文件
cv2.waitKey() #第一个参数是保存文件的名称,必须加jgp,png等的后缀否则报错。第二个参数是保存的对象
cv2.destroyAllWindows()
二、图像二值化(调节阈值)
1.源码一
代码如下(示例):
import cv2
def nothing(): # 定义回调函数
pass
def image_processing(img, Gauss_flag=1, Color_flag=1, Gray_flag=0): # 图像预处理
# 高斯滤波器平滑图像
if Gauss_flag == 1:
img = cv2.GaussianBlur(img, (3, 3), 0)
# 均衡彩 * 像的直方图
if Color_flag == 1:
img = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
# 均衡灰度图像的直方图
if Gray_flag == 1:
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 将彩 * 像转为灰度图像
img = cv2.equalizeHist(img)
return img
def image_canny(img): # 图像边缘检测
# 设置窗口
cv2.namedWindow('Canny')
# 创建滑动条,分别控制各个参数
cv2.createTrackbar('threshold1', 'Canny', 50, 300, nothing) # 阈值1
cv2.createTrackbar('threshold2', 'Canny', 100, 300, nothing) # 较大的阈值2用于检测图像中明显的边缘
# cv2.createTrackbar('apertureSize', 'Canny', 0, 2, nothing) # Sobel算子大小(3,5,7)
cv2.createTrackbar('L2gradient', 'Canny', 0, 1,
nothing) # 参数(布尔值):true:使用更精确的L2范数(两个方向的倒数的平方和再开放),false:使用L1范数(直接将两个方向导数的绝对值相加)
while (1):
# 返回滑动条所在位置的值
threshold1 = cv2.getTrackbarPos('threshold1', 'Canny') # 阈值1
threshold2 = cv2.getTrackbarPos('threshold2', 'Canny') # 阈值2
L2gradient = cv2.getTrackbarPos('L2gradient', 'Canny') # 参数
# aperturesize = cv2.getTrackbarPos('apertureSize', 'Canny') # Sobel算子大小
# size = aperturesize * 2 + 3 # Sobel算子大小(3,5,7)
# Canny边缘检测
img_edges = cv2.Canny(img, threshold1, threshold2, L2gradient=L2gradient)
# 显示边缘化图像
cv2.imshow('Canny', img_edges)
if cv2.waitKey(1) == ord('q'): # 按q退出
break
elif cv2.waitKey(1) == ord('s'): # 按s保存图像到原图像所在目录,命名为output.jpg,再退出!
cv2.imwrite('\\'.join(img_path.split('\\')[:-1]) + '\\output.jpg', img_edges)
print("图像成功保存")
break
cv2.destroyAllWindows()
if __name__ == "__main__":
img_path = input("请输入图片地址(如E:\\Code\\xx.jpg):") # 输入原图像地址
guass_flag = int(input("是否进行高斯滤波(输入1进行,输入0不进行):")) # 输入1为进行高斯滤波,输入0为不进行
color_flag = int(input("是否均衡彩 * 像(输入1进行,输入0不进行):")) # 输入1为进行彩 * 像均衡,输入0为不进行
gray_flag = int(input("是否均衡灰度图像(输入1进行,输入0不进行):")) # 输入1为进行灰度图像均衡,输入0为不进行
# 载入图像
image = cv2.imread(img_path)
# 图像预处理
img = image_processing(image, Gauss_flag=guass_flag, Color_flag=color_flag, Gray_flag=gray_flag)
# 显示原图像
cv2.imshow('Original', image)
# 显示预处理后图像
cv2.imshow('Pretreatment', img)
# 图像边缘检测
image_canny(img)
2.源码二
代码如下(示例):
import cv2
#载入图片
img_original=cv2.imread(r'E:\py\python3.7\test2\test14yuzhi\cell.png')
#设置窗口
cv2.namedWindow('Canny')
#定义回调函数
def nothing(x):
pass
#创建两个滑动条,分别控制threshold1,threshold2
cv2.createTrackbar('threshold1','Canny',50,400,nothing)
cv2.createTrackbar('threshold2','Canny',100,400,nothing)
while(1):
#返回滑动条所在位置的值
threshold1=cv2.getTrackbarPos('threshold1','Canny')
threshold2=cv2.getTrackbarPos('threshold2','Canny')
#Canny边缘检测
img_edges=cv2.Canny(img_original,threshold1,threshold2)
#显示图片
cv2.imshow('original',img_original)
cv2.imshow('Canny',img_edges)
if cv2.waitKey(1)==ord('q'):
break
cv2.destroyAllWindows()
来源:https://blog.csdn.net/qq_45365214/article/details/124745286
0
投稿
猜你喜欢
- 执行表扫描操作之前,将调用info()函数,以便为优化程序提供额外信息。优化程序所需的信息不是通过返回值给定的,你需填充存储引擎类的特定属性
- 本文实例讲述了thinkphp的URL路由规则与配置方法。分享给大家供大家参考。具体分析如下:一、URL规则1、默认是区分大小写的2、如果我
- “深入认识Python内建类型”这部分的内容会从源码角度为大家介绍Python中各种常用的内建类型。
- 一、简介eval()函数用来执行一个字符表达式的值,并返回表达式的值二、语法具体语法:eval(expression[, globals[,
- 1)添加下面一句话到模型中for p in self.parameters(): p.requires_grad = False比如加载了r
- 本文介绍了vue 模拟后台数据(加载本地json文件)调试,分享给大家,也给自己留个笔记首先创建一个本地json文件,放在项目中如下{ &q
- 一、设计说明设计这个自动化的目的是想要交替、重复地使用固定的几个分区(分区编号01~05)来保存数据,当最后一个分区就是快满的时候,我们会把
- <html> <head> <title>Untitled Document</title>
- 一、简介基础知识:需要一定的html和css的语法知识基本概念:PHP(超文本预处理器)是一种通用开源脚本语言,在服务器上执行。PHP文件:
- 使用库元素必须首先在DW中正确建立站点。 库被设计用来使重复性的工作更快、更容易并尽可能地无差错。 任
- 大数据分析必定少不了数据抓取,只有拥有海量的数据才能对数据进行对比分析。因此,网页爬虫是作为程序员必须要懂得技能,下文我将通过文字形式记录下
- 在日常工作中,除了会涉及到使用Python处理文本文件,有时候还会涉及对压缩文件的处理。通常会涉及到的压缩文件格式有:rar:Windows
- 操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在。那么
- 今天因为程序里面要把写入数据库的html源代码以html源编码的形式显示在页面里面,而不要被浏览器解释成。。找了N久都不知道怎么做后来看了一
- 我一般看书喜欢做笔记,这份笔记不知道是什么时候看的什么书做的,也忘了是否是摘自其他地方,总之一份汇总,应该适合初学者,对于Javascrip
- SpringBoot体系内推荐使用Thymeleaf作为前端页面模板。jsp还得自己整合一下。1.项目结构对比以前的项目结构,main目录下
- 下拉菜单平常见到的都是用js来实现的,本文介绍的方法是使用纯CSS实现导航下拉菜单功能,代码符合标准,兼容性好且环保,制作下拉菜单的不错选择
- 在登陆界面中,通常,最重要的部分为登陆的Form表。一个非常棒的提升体验的做法是,在载入页面时自动聚焦到第一个提供用户输入的表单框,让用户不
- ThinkPHP的分组功能是广为开发者使用的一个具有很大实用价值的功能,该功能可以解决中大型项目情况中MVC分层文件过多导致不易管理的问题。
- 在SQL Server Management Studio 用WINDOWS连接的情况下改实列的“属性&rdqu