Python 如何使用轨迹栏进行交互式图像二值化?

Python 如何使用轨迹栏进行交互式图像二值化?,python,image,opencv,image-processing,computer-vision,Python,Image,Opencv,Image Processing,Computer Vision,我有一个代码,它给我使用大津阈值的二值图像。我正在为U-Net制作一个数据集,我想尝试不同的算法(全局和局部),以便保存“最佳”图像。下面是我的图像二值化的代码 导入cv2 将numpy作为np导入 将skimage.filters导入为筛选器 img=cv2.imread('math.png')#读取图像 灰色=cv2.CVT颜色(img,cv2.COLOR_BGR2GRAY)#转换为灰色 平滑=cv2.高斯模糊(灰色,(95,95),0)#模糊 分割=cv2。分割(灰度、平滑、比例=255)

我有一个代码,它给我使用大津阈值的二值图像。我正在为U-Net制作一个数据集,我想尝试不同的算法(全局和局部),以便保存“最佳”图像。下面是我的图像二值化的代码

导入cv2
将numpy作为np导入
将skimage.filters导入为筛选器
img=cv2.imread('math.png')#读取图像
灰色=cv2.CVT颜色(img,cv2.COLOR_BGR2GRAY)#转换为灰色
平滑=cv2.高斯模糊(灰色,(95,95),0)#模糊
分割=cv2。分割(灰度、平滑、比例=255)#用形态学图像分割灰度
#在这里添加形态学。膨胀、侵蚀、打开、关闭等。
锐化=过滤器。反锐化遮罩(除法,半径=1.5,数量=1.5,多通道=假,保留范围=假)#使用反锐化遮罩锐化
夏普=(255*sharp).clip(0255).aType(np.uint8)
thresh=cv2.阈值(夏普,0,255,cv2.thresh_大津)[1]#阈值
我在更大的范围内得到了相当不错的结果,但我想使用
cv2.namedWindow
cv2.createTrackbar
cv2.getTrackbarPos
,这样我就可以通过使用以下函数设置
半径
数量
内核
,膨胀,侵蚀等值

cv2.namedWindow(“跟踪窗口”)
createTrackbar('param1','Tracking Window',0255,dummy)#dummy只是一个不返回任何值的伪函数
param1=cv2.getTrackbarPos('param1','Tracking Window')
我怎样才能得到这些。另外,当我按
s
,按
n
打开下一个图像时,如何保存图像


我的解决方案的代码比预期的要长,但它提供了一些奇特的操作可能性。首先,让我们看看实际的窗口:

有滑动条可供选择

  • 形态操作(扩张、侵蚀、闭合、开放)
  • 结构元素(矩形、椭圆、十字)和
  • 内核大小(此处:限制在范围
    1…21
窗口名称反映前两个滑块的当前设置:

按s键时,将保存包含当前设置的图像:

将图像保存为侵蚀\u椭球体\u SLEM\u 11.png。
按n键时,将选择列表中的下一个图像

在任何时候,按q键时,应用程序将退出。它在处理列表中的所有图像后自动结束

在交互部分之前和之后,您可以添加任何您想要的操作,参见代码

下面是完整的代码:

导入cv2
#收集形态学运算
变形=[cv2.MORPH\u扩张,cv2.MORPH\u侵蚀,cv2.MORPH\u关闭,cv2.MORPH\u打开]
#收集一些文本供以后使用
变形文本={
cv2.MORPH_deplate:“扩张”,
cv2.MORPH_侵蚀:“侵蚀”,
cv2.MORPH_CLOSE:“Closing”,
cv2.MORPH_OPEN:“打开”
}
#收集结构元素
slems=[cv2.MORPH\u RECT,cv2.MORPH\u椭圆,cv2.MORPH\u交叉]
#收集一些文本供以后使用
slem_文本={
cv2.MORPH_RECT:‘矩形SLEM’,
cv2.MORPH_椭圆:“椭球SLEM”,
cv2.MORPH_CROSS:“CROSS SLEM”
}
#收集图像
图像=[…]
#为每个滑块设置最大值
最大变形=len(变形)-1
max_slem=len(slems)-1
max_ks=21
#为每个滑块设置初始值
变形=0
slem=0
ks=1
#设置初始工作映像
温度=无
#设置初始窗口名
title_window='Interactive{}with{}'。格式(morph_text[morph[morph]],
slem_文本[slems[slem]]
#操纵任何滑块时触发
_轨迹栏上的def(未使用):
全局图像、ks、变形、slem、临时、标题窗口
#获取当前滑块值
morph=cv2.getTrackbarPos('Operation',title\u窗口)
slem=cv2.getTrackbarPos('slem',title\u窗口)
ks=cv2.getTrackbarPos('内核大小',标题窗口)
#重置窗口名
setWindowTitle(title_窗口,{}与{}交互)。
格式(变形文字[morphs[morph]],
slem_文本[slems[slem]])
#获取当前形态操作和结构元素
op=变形[变形]
sl=cv2.getStructuringElement(slems[slem],(ks,ks))
#实际形态操作
temp=cv2.morphologyEx(image.copy(),op,sl)
#使用当前设置显示操纵的图像
cv2.imshow(标题窗口,温度)
#迭代图像
对于图像中的图像:
#下面是互动部分之前的步骤
# ...
image=cv2.threshold(cv2.cvtColor(image.copy(),cv2.COLOR\u BGR2GRAY),
0,255,cv2.THRESH_OTSU[1]
#这里开始互动部分
cv2.名称窗口(标题窗口)
cv2.createTrackbar(“操作”,标题窗口,变形,最大变形,在轨迹栏上)
cv2.createTrackbar(“SLEM”,标题窗口,SLEM,最大SLEM,在轨道栏上)
createTrackbar('Kernel size',title\u window,ks,max\u ks,on\u trackbar)
cv2.setTrackbarMin(“内核大小”,标题窗口,1)
在轨迹栏上(0)
k=cv2.等待键(0)
#每次按q时退出
而k!=ord('q'):
#按s键保存图像
如果k==ord('s'):
#在交互部分之后,但在保存之前,请执行以下步骤
# ...
filename='{}{}{}.png'\
格式(变形文字[morphs[morph]],
slem_文本[slems[slem]],
ks)。替换(“”,“”)
cv2.imwrite(文件名,临时文件)
打印('将图像保存为{}.'.format(文件名))
#按n键进入下一个图像
elif k==ord('n'):
打印('下一幅图像')
打破
#如果按下任何其他键,则继续
k=cv2.等待键(0)
#实际退出
如果k==ord('q'):
打破
希望代码是不言自明的。如果没有,请毫不犹豫地提问。您应该能够轻松地添加您自己额外需要的每个滑块,例如