网络编程
位置:首页>> 网络编程>> Python编程>> 详解Python+OpenCV实现图像二值化

详解Python+OpenCV实现图像二值化

作者:用余生去守护  发布时间:2022-01-02 13:08:07 

标签:Python,OpenCV,图像,二值化

一、图像二值化

1.效果

详解Python+OpenCV实现图像二值化

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.源码一

详解Python+OpenCV实现图像二值化

详解Python+OpenCV实现图像二值化

详解Python+OpenCV实现图像二值化

代码如下(示例):

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连接的情况下改实列的&ldquo;属性&rdqu
手机版 网络编程 asp之家 www.aspxhome.com