假设我有一个400 * 300的灰度图像,现在我想水平扫描每条线并取那条线的平均值128,这样就可以根据它们与均值(128)的差来缩放这些值,这不会导致任何失真图片。

评论

您是否要针对具有特定编程语言/库的解决方案?

解决方案可以是任何语言....更重要的是算法

#1 楼

这是一个有关如何使用Python,Numpy和Matplotlib进行此操作的示例。
右边的图像已被平均(逐行),而左边的图像是原始图像。



编辑:正如@Nathan Reed所建议的那样,当行平均为0时,我避免了翻转颜色。现在,平均行为0的行的值为0.5(128)。先前遇到的暗图像是由于缩放导致的值大于1(255),在matplotlib的图像渲染器中表示为白色。我通过将任何像素的最大值设置为1来解决此问题。

 import numpy as np
from matplotlib import image as mpimg
from matplotlib import pyplot as plt

def rgb2gray(rgb):
    return np.dot( rgb[...,:3], [0.299, 0.587, 0.144] )

imgPath = "C:/myImg.jpg"

im = mpimg.imread( imgPath )
gs = rgb2gray( im )

averaged = gs.copy()

for row in averaged:
    rowAvg = sum( row ) / len( row )
    if rowAvg == 0:
        row = 0.5
    else:
        # Scale each row by ratio between 128 and current row avg
        row *= 0.5 / rowAvg

    # Make sure that no pixel has a higher value than 1
    if rowAvg > 0: row[row>1] = 1

plt.subplot( 1, 2, 1 ), plt.imshow( gs,       'gray' )
plt.subplot( 1, 2, 2 ), plt.imshow( averaged, 'gray' )

plt.show()
 


这里是另一个带有简单渐变图像的测试(原始图像为左):


评论


$ \ begingroup $
第一个图像对看起来有些问题...结果大部分是全黑的,这似乎不正确。另外,最好将其除以零,这样输入中全黑的行就不会翻转。在这种情况下,也许只用所有128替换行?
$ \ endgroup $
–内森·里德(Nathan Reed)
2015年12月24日在21:30



$ \ begingroup $
第一张和第二张img的算法相同。会检查一下,对于翻转有意义,谢谢。
$ \ endgroup $
–TLousky
15年12月24日在22:20

$ \ begingroup $
乍看之下,上述解决方案似乎是正确的,但是如果用户输入输出图像作为输入,那么它将显示失真的输出。该解决方案应该是自适应的,并了解何时不执行计算,因为第一个输入的输出就是解决方案,因此当再次输入输出时,应该看不到任何变化。
$ \ endgroup $
– Sandiip
16年1月1日在7:45

$ \ begingroup $
@SandeepNeupane很有道理,尽管这不是问题作者所要的。我相信这个答案可以作为更自适应,更完整解决方案的基础。
$ \ endgroup $
–TLousky
16年1月1日在18:16