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

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

一、图像二值化

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

标签:Python,OpenCV,图像,二值化
0
投稿

猜你喜欢

  • python实现简单五子棋游戏

    2021-04-04 16:15:57
  • SQL Server 日期相关资料详细介绍

    2012-07-11 16:14:07
  • Windows下安装python MySQLdb遇到的问题及解决方法

    2022-07-20 13:22:36
  • oracle 在一个存储过程中调用另一个返回游标的存储过程

    2009-09-26 18:54:00
  • JavaScript几种弹窗事件的使用

    2023-08-24 15:59:08
  • 通过js获取div的background-image属性

    2023-08-23 06:07:23
  • ASP中取得图片宽度和高度的类

    2008-10-29 12:38:00
  • 排序的人文魅力

    2008-05-06 12:47:00
  • 960 Grid System 基本原理及使用方法

    2009-02-28 13:35:00
  • form 元素内的字段 name 不要跟 form 属性名称一致

    2008-10-22 13:25:00
  • focus 进 textarea 元素后光标位置的修复

    2008-09-27 13:27:00
  • 模拟下拉菜单[兼容IE系列以及火狐]

    2009-12-13 10:23:00
  • python使用Flask框架获取用户IP地址的方法

    2023-08-09 03:15:23
  • 讲解SQL Server数据库的触发器安全隐患

    2009-01-13 14:01:00
  • sql数据库批量处理脚本

    2011-11-03 17:23:19
  • DreamWeaver批处理提高篇

    2007-12-03 11:34:00
  • 桌面中心(二)数据库写入

    2023-11-18 12:26:15
  • 用一个案例讲解SQL Server数据库恢复

    2008-11-28 14:17:00
  • python 划分数据集为训练集和测试集的方法

    2023-01-10 12:18:36
  • 微软SQLServer密码管理的危险判断

    2008-11-24 17:34:00
  • asp之家 网络编程 m.aspxhome.com