详解Python+OpenCV实现图像二值化
作者:用余生去守护 时间:2022-01-02 13:08:07
一、图像二值化
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()
来源:https://blog.csdn.net/qq_45365214/article/details/124745286
标签:Python,OpenCV,图像,二值化
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
python实现简单五子棋游戏
2021-04-04 16:15:57
![](https://img.aspxhome.com/file/2023/5/65915_0s.jpg)
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
![](https://img.aspxhome.com/file/2023/4/56174_0s.png)
通过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
![](https://img.aspxhome.com/file/UploadPic/200912/13/menu-37s.gif)
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
![](https://img.aspxhome.com/file/UploadPic/20072/200723113447246s.gif)
桌面中心(二)数据库写入
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