ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Numpy,Python中的“拉伸”直方图(级别)

2019-12-10 23:55:39  阅读:606  来源: 互联网

标签:image-processing python numpy


我有一个灰度图像,其背景是0-255色标,是中白色,平均像素色值为246;前景为中灰色,平均像素颜色值为186.

我想将246以上的每个像素“偏移”到255,将186以下的每个像素“偏移”到零,并“拉伸”之间的所有像素.是否有任何现成的算法/过程可以在numpy或python中执行此操作,还是必须“手动”计算新的级别/直方图(如我到目前为止所做的那样)?

这相当于在Gimp或Photoshop中,打开级别窗口,并分别用白色和黑色吸管选择要创建白色的亮区域和要创建黑色的较暗区域:应用程序修改了级别/直方图(“拉伸”所选点之间的值).

我正在尝试的一些图像:

page after page shadow elimination
Sampled colours
Result

解决方法:

这是一种方法-

def stretch(a, lower_thresh, upper_thresh):
    r = 255.0/(upper_thresh-lower_thresh+2) # unit of stretching
    out = np.round(r*(a-lower_thresh+1)).astype(a.dtype) # stretched values
    out[a<lower_thresh] = 0
    out[a>upper_thresh] = 255
    return out

根据OP,设置的标准是:

>将246以上的每个像素“移动”到255,因此247及以上的像素应变为255.
> 186以下的每个像素都为零,因此185以下的像素应变为0.
>因此,基于上述两个要求,186应该变为大于0的值,依此类推,直到246应该小于255.

另外,我们也可以使用np.where使它更紧凑-

def stretch(a, lower_thresh, upper_thresh):
    r = 255.0/(upper_thresh-lower_thresh+2) # unit of stretching
    out = np.round(r*np.where(a>=lower_thresh,a-lower_thresh+1,0)).clip(max=255)
    return out.astype(a.dtype)

样品运行-

# check out first row input, output for variations
In [216]: a
Out[216]: 
array([[186, 187, 188, 246, 247],
       [251, 195, 103,   9, 211],
       [ 21, 242,  36,  87,  70]], dtype=uint8)

In [217]: stretch(a, lower_thresh=186, upper_thresh=246)
Out[217]: 
array([[  4,   8,  12, 251, 255], 
       [255,  41,   0,   0, 107],
       [  0, 234,   0,   0,   0]], dtype=uint8)

标签:image-processing,python,numpy
来源: https://codeday.me/bug/20191210/2105248.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有