数字图像处理之灰度化

    囧,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)

         这是对于RGB图的灰度化方法,其中我使用了Python Image Library(PIL)库来对图像进行操作,图像的'L'模式就是表示这个图示一个8位的灰度图。

         然后对于图像来说,并不是只有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')

    以下是效果图:

    数字图像处理之灰度化_第1张图片数字图像处理之灰度化_第2张图片 

    Owari


你可能感兴趣的:(数字图像)