囧,ADK还要更新一大截。所以我还是接着写吧,接下来是数字图像的相关文章,全部使用Python实现。
首先讲的是灰度化。
开始,我们先讲讲什么是灰度。
大家都知道,一幅图片有很多个像素点,对于RGB图像来说,像素点是有RGB值的。当R=G=B时,我们就称这种颜色是一种灰度,由于RGB都只占8位,所以这里我们说的灰度也只有256种(0 - 255)。那么对于一张RGB彩色图,我们怎么让它变成一张合理的灰度图呢?
有以下四种方法:
1.分量法:
对于每一个像素点,取其任意一种(R或G或B)为该点的灰度值,显然这种方法不是很合理,所以我就不多做叙述。
2.最大值法:
对于每一个像素点,取Max(R,G,B)为该点的灰度值。我也不多做叙述。
3.平均值发:
对于每一个像素点,取Avg(R,G,B)为该点的灰度值。我也不多做叙述。
4.加权平均法:
对于每一个像素点,由于人眼对红色光,绿色光,蓝色光的敏感程度不同而赋予不同的权重,从而得到该点的灰度值。
公式如下:
Gray = 0.30 * R + 0.59 * G + 0.11 *B
#灰度化
def greyyed():
global greyyedImage
image = originalImage.convert('RGB')
h,w = image.size
greyyedImage = Image.new('L',(h,w))
opix = image.load()
npix = greyyedImage.load()
for i in range (h):
for j in range (w):
npix[i,j] = opix[i,j][0] * 0.299 + opix[i,j][1] * 0.587 + opix[i,j][2] * 0.114
showPicture(greyyedImage , newCanvas)
histogram(greyyedImage , newHisCanvas)
然后对于图像来说,并不是只有24位图(RGB),还有一些是调色板图像,我们需要做的是用同样的方法,不用改变原图的索引,而直接对调色板灰度化就行了。这些可能对C++,Java来说需要一些实现,但是对于Python来说,只需要建立一个灰度图'L'然后再把原图复制过去就行了。
#调色板图像灰度化
def colorGrey():
image = originalImage.convert('P')
showPicture(image , oldCanvas)
h,w = image.size
processImage = Image.new('L' , (h , w))
opix = image.load()
npix = processImage.load()
for i in range(h):
for j in range(w):
npix[i,j] = opix[i,j]
showPicture(processImage , newCanvas)
histogram(processImage , newHisCanvas)
由于我的UI在里边,所以这个代码你们可能不用直接使用。你们可以添加自己的显示方法来查看这个图像,比如image.save(),image.show()等。
然后如果你不是学习如何灰度化,你可以使用PIL的库函数image.convert(),转成灰度图只需要对image这个对象使用这个函数。
#灰度化库函数
def Grey(img):
newImage = img.convert('L')
以下是效果图:
Owari