详解Python+OpenCV实现图像二值化
短信预约 -IT技能 免费直播动态提醒
一、图像二值化
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图像二值化内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341