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

 更新时间:2022年05月13日 15:20:02   作者:用余生去守护  
图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。本文将通过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()

到此这篇关于详解Python+OpenCV实现图像二值化的文章就介绍到这了,更多相关Python OpenCV图像二值化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解python 中in 的 用法

    详解python 中in 的 用法

    in在Python中是操作符,具体来说是成员操作符。这篇文章主要介绍了python 中in 的 用法,需要的朋友可以参考下
    2019-12-12
  • 使用Pygal库创建可缩放的矢量图表的操作方法

    使用Pygal库创建可缩放的矢量图表的操作方法

    在本文中,我们探讨了如何使用Pygal库创建可缩放的矢量图表,首先,我们介绍了Pygal的基本概念和安装方法,然后通过多个示例演示了如何创建各种类型的图表,包括折线图、柱状图、饼图、散点图、雷达图和地图等,需要的朋友可以参考下
    2024-05-05
  • 使用tf.keras.MaxPooling1D出现错误问题及解决

    使用tf.keras.MaxPooling1D出现错误问题及解决

    这篇文章主要介绍了使用tf.keras.MaxPooling1D出现错误问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Python实现数据库并行读取和写入实例

    Python实现数据库并行读取和写入实例

    本篇文章主要介绍了Python实现数据库并行读取和写入实例,非常具有实用价值,需要的朋友可以参考下
    2017-06-06
  • Scala中使用Jsoup库处理HTML文档的案例分析

    Scala中使用Jsoup库处理HTML文档的案例分析

    Scala是一种多范式的编程语言,具有函数式编程和面向对象编程的特点,同时也能够与Java语言完美兼容,它拥有强大的类型推断、高阶函数、模式匹配等特性,使得代码更加简洁、灵活和易于维护,这篇文章主要介绍了Scala中使用Jsoup库处理HTML文档的案例分析,需要的朋友可以参考下
    2024-04-04
  • Python2.x利用commands模块执行Linux shell命令

    Python2.x利用commands模块执行Linux shell命令

    这篇文章主要介绍了Python2.x利用commands模块执行Linux shell命令 的相关资料,需要的朋友可以参考下
    2016-03-03
  • Python列表生成器的循环技巧分享

    Python列表生成器的循环技巧分享

    这篇文章主要介绍了Python列表生成器的循环技巧分享,本文讲解了列表生成器中一个循环和二个循环的不同写法,需要的朋友可以参考下
    2015-03-03
  • Python机器学习NLP自然语言处理基本操作家暴归类

    Python机器学习NLP自然语言处理基本操作家暴归类

    本文是Python机器学习NLP自然语言处理系列文章,带大家开启一段学习自然语言处理 (NLP) 的旅程。本篇文章主要学习NLP自然语言处理家暴归类
    2021-09-09
  • python如何使用Redis构建分布式锁

    python如何使用Redis构建分布式锁

    这篇文章主要介绍了python如何使用Redis构建分布式锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • python中OrderedDict的使用方法详解

    python中OrderedDict的使用方法详解

    本篇文章主要介绍了python中OrderedDict的使用方法详解,非常具有实用价值,需要的朋友可以参考下
    2017-05-05

最新评论