脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - 详解Python+OpenCV实现图像二值化

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

2023-01-13 13:49用余生去守护 Python

图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。本文将通过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()

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

原文链接:https://blog.csdn.net/qq_45365214/article/details/124745286

延伸 · 阅读

精彩推荐
  • PythonPython语言描述随机梯度下降法

    Python语言描述随机梯度下降法

    这篇文章主要介绍了Python语言描述随机梯度下降法,具有一定借鉴价值,需要的朋友可以参考下...

    lc1986121712792020-12-31
  • Python利用 Python 让图表动起来

    利用 Python 让图表动起来

    这篇文章主要给大家分享如何利用 Python 让图表动起来,本文围绕Python 让图表动起来的话题举例matplotlib动画功能的一个例子展开文章内容,需要的朋友可以...

    野客10452022-02-13
  • Pythonpycharm 实现复制一行的快捷键

    pycharm 实现复制一行的快捷键

    这篇文章主要介绍了pycharm 实现复制一行的快捷键,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    自由的小白7452021-08-25
  • Pythonpython 爬取天气网卫星图片

    python 爬取天气网卫星图片

    根据网站URL的规律编写的一个爬取天气网卫星图片的python爬虫,使用了requests包,感兴趣的朋友可以参考下...

    MrWayneLee8262021-11-25
  • Pythonpython多次绘制条形图的方法

    python多次绘制条形图的方法

    这篇文章主要为大家详细介绍了python多次绘制条形图的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    涂兆诚7892022-12-04
  • Python使用 Python 玩转 GitHub 的贡献板(推荐)

    使用 Python 玩转 GitHub 的贡献板(推荐)

    这篇文章主要介绍了使用 Python 玩转 GitHub 的贡献板的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...

    亲故_58a17602021-06-12
  • PythonPython学习笔记之解析json的方法分析

    Python学习笔记之解析json的方法分析

    这篇文章主要介绍了Python解析json的方法,结合实例形式分析了常见的Python解析与转换json格式数据相关操作技巧,需要的朋友可以参考下...

    我要的shine5062020-09-30
  • Python详解Python中的测试工具

    详解Python中的测试工具

    本文介绍了两个Python中的测试工具: doctest和unittest,并配以简单的例子来说明这两个测试模块的使用方法,需要的朋友可以参考下...

    jclian918402021-07-03