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

目录
  • 一、图像二值化
    • 1.效果
    • 2.源码
  • 二、图像二值化(调节阈值)
    • 1.源码一
    • 2.源码二

一、图像二值化

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图像二值化内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)

    前一篇研究了opencv二值化方法threshold的使用,但是这个方法也存在一定的局限性,假如有一张图存在明显的明暗不同的区域,如下图 可以看到左边部分因为整体偏暗,导致二值化后变成全黑,丢失了所有细节,这显然不是我们想要的结果. 原因threshold函数使用一个阈值对图像进行二值化,导致小于这个阈值的像素点全都变成0.因此使用一个阈值的二值化方法并不适用于上面的这张图.那怎么搞? 很明显,上面这张图只有左右两个区域明显亮度不同,最简单的方法就是把图分成两个区域,每个区域分别进行二值化,也就

  • opencv python如何实现图像二值化

    这篇文章主要介绍了opencv python如何实现图像二值化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 import cv2 as cv import numpy as np import matplotlib.pyplot as plt # 二值图像就是将灰度图转化成黑白图,没有灰,在一个值之前为黑,之后为白 # 有全局和局部两种 # 在使用全局阈值时,我们就是随便给了一个数来做阈值,那我们怎么知道我们选取的这个数的好坏呢?答

  • Python+OpenCV图像处理——图像二值化的实现

    简介:图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程. 普通图像二值化 代码如下: import cv2 as cv import numpy as np #全局阈值 def threshold_demo(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) #把输入图像灰度化 #直接阈值化是对输入的单通道矩阵逐像素进行阈值分割. ret, binary = cv.threshold(gray

  • Python图像处理二值化方法实例汇总

    在用python进行图像处理时,二值化是非常重要的一步,现总结了自己遇到过的6种 图像二值化的方法(当然这个绝对不是全部的二值化方法,若发现新的方法会继续新增). 1. opencv 简单阈值 cv2.threshold 2. opencv 自适应阈值 cv2.adaptiveThreshold (自适应阈值中计算阈值的方法有两种:mean_c 和 guassian_c ,可以尝试用下哪种效果好) 3. Otsu's 二值化 例子: import cv2 import numpy as np f

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

    目录 一.图像二值化 1.效果 2.源码 二.图像二值化(调节阈值) 1.源码一 2.源码二 一.图像二值化 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

  • 详解python opencv图像混合算术运算

    目录 图片相加 cv2.add() 按位运算 图片相加 cv2.add() 要叠加两张图片,可以用 cv2.add() 函数,相加两幅图片的形状(高度 / 宽度 / 通道数)必须相同.         numpy中可以直接用res = img + img1相加,但这两者的结果并不相同(看下边代码):         add()两个图片进行加和,大于255的使用255计数.         numpy会对结果取256(相当于255+1)的模: import numpy as np import c

  • 详解Python+OpenCV进行基础的图像操作

    目录 介绍 形态变换 腐蚀 膨胀 创建边框 强度变换 对数变换 线性变换 去噪彩色图像 使用直方图分析图像 介绍 众所周知,OpenCV是一个用于计算机视觉和图像操作的免费开源库. OpenCV 是用 C++ 编写的,并且有数千种优化的算法和函数用于各种图像操作.很多现实生活中的操作都可以使用 OpenCV 来解决.例如视频和图像分析.实时计算机视觉.对象检测.镜头分析等. 许多公司.研究人员和开发人员为 OpenCV 的创建做出了贡献.使用OpenCV 很简单,而且 OpenCV 配备了许多工

  • 详解Python OpenCV数字识别案例

    前言 实践是检验真理的唯一标准. 因为觉得一板一眼地学习OpenCV太过枯燥,于是在网上找了一个以项目为导向的教程学习.话不多说,动手做起来. 一.案例介绍 提供信用卡上的数字模板: 要求:识别出信用卡上的数字,并将其直接打印在原图片上.虽然看起来很蠢,但既然可以将数字打印在图片上,说明已经成功识别数字,因此也可以将其转换为数字文本保存.车牌号识别等项目的思路与此案例类似. 示例: 原图 处理后的图 二.步骤 大致分为如下几个步骤: 1.模板读入 2.模板预处理,将模板数字分开,并排序 3.输入

  • 详解Python OpenCV图像分割算法的实现

    目录 前言 1.图像二值化 2.自适应阈值分割算法 3.Otsu阈值分割算法 4.基于轮廓的字符分离 4.1轮廓检测 4.2轮廓绘制 4.3包围框获取 4.4矩形绘制 前言 图像分割是指根据灰度.色彩.空间纹理.几何形状等特征把图像划分成若干个互不相交的区域. 最简单的图像分割就是将物体从背景中分割出来 1.图像二值化 cv2.threshold是opencv-python中的图像二值化方法,可以实现简单的分割功能. retval, dst = cv2.threshold(src, thresh

  • 详解Python+opencv裁剪/截取图片的几种方式

    前言 在计算机视觉任务中,如图像分类,图像数据集必不可少.自己采集的图片往往存在很多噪声或无用信息会影响模型训练.因此,需要对图片进行裁剪处理,以防止图片边缘无用信息对模型造成影响.本文介绍几种图片裁剪的方式,供大家参考. 一.手动单张裁剪/截取 selectROI:选择感兴趣区域,边界框框选x,y,w,h selectROI(windowName, img, showCrosshair=None, fromCenter=None): . 参数windowName:选择的区域被显示在的窗口的名字

  • C#数字图像处理之图像二值化(彩色变黑白)的方法

    本文实例讲述了C#数字图像处理之图像二值化(彩色变黑白)的方法.分享给大家供大家参考.具体如下: //定义图像二值化函数 private static Bitmap PBinary(Bitmap src,int v) { int w = src.Width; int h = src.Height; Bitmap dstBitmap = new Bitmap(src.Width ,src.Height ,System .Drawing .Imaging .PixelFormat .Format24

随机推荐