相关文章推荐
深情的夕阳  ·  Tkinter ...·  1 年前    · 
爱旅游的保温杯  ·  input file ...·  1 年前    · 

Python PIL库实现可设定阈值的二值图像转换

3 年前 · 来自专栏 小白的深度学习自学笔记

前言

最近一直在做深度学习图像分割方面的项目,本来是个很简单的二分类问题,但是最后输出后却发现不仅仅是0和255两种像素类型,后来思考后才发现他输出的是类似于置信度的东西,具体的我还没有完全明白,但是越白的像素值说明他越可能接近白这一类,越黑的就越可能接近黑这一类,所以这里铁定要进行阈值分割,而且通过阈值分割或许还能够得到更好的分割效果。

这里主要介绍用python PIL库的方法将输出的图片进行阈值分割。

方法

设定二值图像转换的阈值

PIL可以对图像的颜色进行转换,并支持诸如24位彩色、8位灰度图和二值图等模式,简单的转换可以通过 Image.convert(mode)函数 完成,其中mode表示输出的颜色模式,例如''L''表示灰度,''1''表示二值图模式等。但是利用convert函数将灰度图转换为二值图时,是采用 固定的阈 值127来实现的,即灰度高于127的像素值为1,而灰度低于127的像素值为0。为了能够通过自定义的阈值实现灰度图到二值图的转换,就要用到 Image.point函数

Image.point函数有多种形式,这里只讨论Image.point(table, mode),利用该函数可以通过查表的方式实现像素颜色的模式转换,其中table为颜色转换过程中的映射表,每个颜色通道应当有256个元素,而 mode表示所输出的颜色模式,同样的,''L''表示灰度,''1''表示二值图模式。可见,转换过程的关键在于设计映射表,如果只是需要一个简单的箝 位值,可以将table中高于或低于箝位值的元素分别设为1与0。当然,由于这里的table并没有什么特殊要求,所以可以通过对元素的特殊设定实现 (0, 255)范围内,任意需要的一对一映射关系。

代码

from PIL import Image
im  =  Image.open("test.png")
# convert to grey level image 
Lim  =  im.convert("L")
Lim.save("test_gray.png")
 #  setup a converting table with constant threshold 
threshold  = 200 
table  =  []
for  i  in  range( 256 ):
     if  i  <  threshold: