首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一种用于颜色分割的均值移位图像处理算法

一种用于颜色分割的均值移位图像处理算法
EN

Code Review用户
提问于 2012-11-02 08:14:44
回答 1查看 1.4K关注 0票数 4

我正在用Python/NumPy实现用于颜色分割的mean图像处理算法的一个版本。

我编写了一个纯NumPy版本的每个像素的实际平均偏移量(我认为这是大部分时间所花费的时间)。它将RGB值的数组从父图像中分割出来,然后创建下限和高界RGB参考数组,并为像素生成一个布尔掩蔽数组,用于平均和平均值。

还有进一步的优化吗?我怀疑,将x/y循环矢量化可能会加快速度,但对我的生活而言,但我还不知道如何实现。(有些人是如何生成每个像素网格的数组来工作的,然后将均值移位推广到接收数组输入?)gL是网格长度。gS是gL平方--网格中的像素数。

代码语言:javascript
复制
for itr in xrange(itrs):
    if itr != 0:
        img = imgNew
    for x in xrange(gL,height-gL):
        for y in xrange(gL,width-gL):
            cGrid = img[x-gSmp:(x+gSmp+1),y-gSmp:(y+gSmp+1)]
            cLow,cUp = np.empty((gL,gL,3)),np.empty((gL,gL,3))
            cLow[:] = [img[x,y][0]-tol,img[x,y][1]-tol,img[x,y][2]-tol]
            cUp[:] = [img[x,y][0]+tol,img[x,y][1]+tol,img[x,y][2]+tol]
            cBool = np.any(((cLow < cGrid) & (cUp > cGrid)),axis=2)
            imgNew[x,y] =  np.sum(cGrid[cBool],axis=0)/cBool.sum()
EN

回答 1

Code Review用户

回答已采纳

发布于 2012-11-22 13:25:27

下面的代码是第一次尝试,但仍未被矢量化。这里的要点是提取创建cLow和cUp (不要在循环中创建数组,总是“预先分配”内存),公差级别的计算可以在一次操作中完成(假设此时广播是可能的),最后我删除了将imgNew复制到img的条件情况(我也怀疑您不想将最后一次迭代复制回img。如果是这样,则必须删除循环之前的复制行,并将循环开始处的副本移到其末尾。)。

代码语言:javascript
复制
diff_height_gL = height - gL
diff_width_gL = width - gL
sum_gSmp_one = gSmp + 1

cLow, cUp = np.empty((gL, gL, 3)), np.empty((gL, gL, 3))

imgNew = img.copy()

for itr in xrange(itrs):

    img[:] = imgNew

    for x in xrange(gL, diff_height_gL):
        for y in xrange(gL, diff_width_gL):

            cGrid = img[x-gSmp:(x + sum_gSmp_one), y-gSmp:(y + sum_gSmp_one)]

            cLow[:] = img[x, y, :] - tol
            cUp[:] = img[x, y, :] + tol

            cBool = np.any(((cLow < cGrid) & (cUp > cGrid)), axis=2)

            imgNew[x, y] =  np.sum(cGrid[cBool], axis=0) / cBool.sum()

这个问题似乎完全可以进行多重处理。这可以作为矢量化的替代/扩展。如果我有时间我会尝试矢量化..。

类甲壳虫

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/18149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档