研究图像的一部分而不是白色背景

时间:2014-05-01 09:28:28

标签: python image-processing tkinter

免责声明:此问题与家庭作业项目有关。

我正在申请研究香蕉,并告诉它是否成熟。我已经创建了一个允许打开图像的窗口,并打开一个弹出窗口,说明点击的像素是否成熟。我将像素rgb值转换为hsv并诊断它是否成熟。

snapshot of application

现在,我想提供整个图片的自动分析(在analyseauto方法中)。问题是我只想要研究香蕉像素,而不是白色。我的问题是如何只选择像素的一部分,所以香蕉而不是白色背景。我可以使用getdata执行此操作吗?

以下是相关的一段代码。

def analyseauto():
    global image
    listTriplets=list(image.getdata()) # list of rgb values
    print(listTriplets)

#click callback
def pointeur(event):
    global image

    x=str(event.x)
    y=str(event.y)
    x1=int(x)
    y1=int(y)

    R,V,B=image.getpixel((x1,y1)) 

    #convert to HSV (my T hold hue, from french "teinte")
    #[...]
    #update side text field
    #[...]

    Mûre = 0
    PasMûre = 0
    Pourri = 0
    AnalyseManuelle = 0
    PixelNoBanane = 0
    x2=0

    #diagnose
    # m value (between 1 and 4) record pixel state
    if 0<=T<=360 and 0<=S<=100 and 0<=V<=100:
        if 40<= T <=56 and 50<= S <=100 and 70<= V <=100:
            print("Il s'agit d'un pixel Mûre ")
            Mûre = Mûre+1
            x2 = x2+1
            m=1
            m=int(m)

        if 50<= T <=100 and 70<= S <=100 and 20<= V <=70:
            print("Il s'agit d'un pixel pas Mûre")
            PasMûre = PasMûre+1
            x2 = x2+1
            m=2
            m=int(m)

        if 0<= T <=30 and 70<= S <=100 and 10<= V <=50:
            print("Il s'agit d'un pixel Pourri")
            Pourri = Pourri+1
            x2 = x2+1
            m=3
            m=int(m)

    if x2 == 0 :
        print ("le pixel n'est pas compris dans les echelles definis")
        PixelNoBanane = PixelNoBanane+1
        m=4
        m=int(m)

    # display popup with plain text answer

完整的应用程序代码on gist。我用于测试的香蕉的例子:

1 个答案:

答案 0 :(得分:1)

我认为使用getdata是一种可以接受的方式来做你想做的事情,但我认为你应该首先调整你的形象。 getdata将返回一个列表,但是以当前图片大小:

>>> banana = Image.open('banana.jpg')
>>> banana
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=847x567 at 0x2C26440>

该列表的像素值为480,249像素,这可能有点过分。

如果您将其调整为50x50:

>>> banana = banana.resize((50,50))

然后使用getdata

>>> banana = banana.resize((50,50))
>>> pixels = banana.getdata()
>>> len(pixels)
2500
>>> pixels = set(pixels) # remove duplicates
>>> len(pixels)
670

这似乎更易于管理。然后,只需从集合中转储(255,255,255)值,也可以转换为任何浅灰色,并获得表示要测试的颜色的平均值,并像以前一样运行测试(仅在一个像素上) RGB值)。

希望我理解正确,这有帮助。