使用 PIL 修剪扫描图像?

2024-01-09

修剪使用扫描仪输入的图像并因此具有较大的白色/黑色区域的方法是什么?


熵解似乎有问题并且计算过于密集。为什么不进行边缘检测?

我刚刚编写了这段 python 代码来为自己解决同样的问题。我的背景是肮脏的白色,所以我使用的标准是黑暗和颜色。我简化了这个标准,只取每个像素的 R、B 或 B 值中的最小值,这样黑色或饱和红色都一样突出。我还使用了每行或每列的最暗像素的平均值。然后我从每一个边缘开始,努力进入,直到跨过门槛。

这是我的代码:

#these values set how sensitive the bounding box detection is
threshold = 200     #the average of the darkest values must be _below_ this to count (0 is darkest, 255 is lightest)
obviousness = 50    #how many of the darkest pixels to include (1 would mean a single dark pixel triggers it)

from PIL import Image

def find_line(vals):
    #implement edge detection once, use many times 
    for i,tmp in enumerate(vals):
        tmp.sort()
        average = float(sum(tmp[:obviousness]))/len(tmp[:obviousness])
        if average <= threshold:
            return i
    return i    #i is left over from failed threshold finding, it is the bounds

def getbox(img):
    #get the bounding box of the interesting part of a PIL image object
    #this is done by getting the darekest of the R, G or B value of each pixel
    #and finding were the edge gest dark/colored enough
    #returns a tuple of (left,upper,right,lower)

    width, height = img.size    #for making a 2d array
    retval = [0,0,width,height] #values will be disposed of, but this is a black image's box 

    pixels = list(img.getdata())
    vals = []                   #store the value of the darkest color
    for pixel in pixels:
        vals.append(min(pixel)) #the darkest of the R,G or B values

    #make 2d array
    vals = np.array([vals[i * width:(i + 1) * width] for i in xrange(height)])

    #start with upper bounds
    forupper = vals.copy()
    retval[1] = find_line(forupper)

    #next, do lower bounds
    forlower = vals.copy()
    forlower = np.flipud(forlower)
    retval[3] = height - find_line(forlower)

    #left edge, same as before but roatate the data so left edge is top edge
    forleft = vals.copy()
    forleft = np.swapaxes(forleft,0,1)
    retval[0] = find_line(forleft)

    #and right edge is bottom edge of rotated array
    forright = vals.copy()
    forright = np.swapaxes(forright,0,1)
    forright = np.flipud(forright)
    retval[2] = width - find_line(forright)

    if retval[0] >= retval[2] or retval[1] >= retval[3]:
        print "error, bounding box is not legit"
        return None
    return tuple(retval)

if __name__ == '__main__':
    image = Image.open('cat.jpg')
    box = getbox(image)
    print "result is: ",box
    result = image.crop(box)
    result.show()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 PIL 修剪扫描图像? 的相关文章

随机推荐

  • 设计 RESTful 登录服务

    我经历过类似的问题here https stackoverflow com questions 4608225 how do i implement login in a restful web service 但我还不清楚概念 这是我的场
  • Spark 使用数据局部性吗?

    我正在尝试了解 Apache Spark 的内部结构 我想知道 Spark 是否使用某些机制来确保从 InputFormat 读取或写入 OutputFormat 或 Spark 本机支持的其他格式而不是从 MapReduce 派生的格式
  • System.NotSupportedException - 无法比较“System.Linq.IQueryable”类型的元素

    我目前收到以下错误 gt EntityFramework SqlServer dll 中发生 System NotSupportedException 类型的异常 但未在用户代码中处理 其他信息 无法比较 System Linq IQuer
  • python selenium 将密钥发送到只读文本框

    我正在尝试使用下面的 python selenium 代码将密钥发送到下面的字段
  • 单行删除重复项,保持列表的排序[重复]

    这个问题在这里已经有答案了 我有以下清单 Herb Alec Herb Don 我想在保持顺序的同时删除重复项 所以它是 Herb Alec Don 以下是我详细地执行此操作的方法 l new for item in l old if it
  • 如何在 r2dbc 中连接表?

    在java反应器中 r2dbc 我有两个表 A B 我还为它们定义了存储库 如何获取A连接B组成的数据 我只提出以下方法 从 A 调用databaseClient select 然后在循环中从 B 调用 select 但我想要更有效和反应性
  • 如何将浮点数转换为字符串而不考虑区域设置?

    我的产品面向葡萄牙受众 其中逗号是小数点符号 我通常使用 CString Format 将数字输入字符串 它会考虑计算机的区域设置 虽然总的来说这是一个很好的方法 但我在格式化 SQL 查询时遇到了问题 例如 CString szInser
  • PL/Python 和 postgreSQL:返回多列表的最佳方法是什么?

    在 Pl Python 中 RETURNS setof 或 RETURNS table 子句用于返回类似结构化数据的表 在我看来 必须提供每一列的名称才能返回表 如果您有一个包含几列的表格 那么这很容易 但是 如果您有一个包含 200 列的
  • 如何将多列连接成单列(事先不知道其数量)?

    假设我有以下数据框 agentName original dt parsed dt user text qwertyuiop 0 0 16102 0 0 我希望创建一个新的数据框 其中多一列 该列连接了该行的所有元素 agentName o
  • 用 python 求解超越方程组

    假设我有以下四个方程 cos x x a 余弦 y y b a b 1 c sinc x d sinc y 对于未知变量x y a and b 注意cos x x a有多种解决方案 变量也类似y 我只感兴趣x and y值 首先是正根 如果
  • CSS“框架”可以解释浏览器的异常情况吗?

    我为一家小型媒体公司建立网站 不幸的是 我们大约 45 50 的客户群使用 IE6 而另一半则几乎均等地使用 Firefox 和基于 Webkit 的浏览器 还有少数 Opera 用户 我的每一个网站都使用类似于 Eric Meyer 的重
  • 如何从多个嵌套if条件调用json

    我正在使用 CodeIgniter 我正在研究一个小项目 它是一个批次列表 现在 如果管理员想要创建批次列表 那么应该输入开始日期和结束日期以及开始时间和结束时间 然后它将在数据库中检查批次是否在相同的日期和时间运行 如果是 那么它将显示该
  • Ruby regexp:捕获url的路径

    我想从任何 URL 中提取其路径 例如 URL https stackoverflow com questions ask https stackoverflow com questions ask路径 问题 提问 这应该不难 url w
  • 场景中有多个反射器:如何实现clone()函数?

    我需要大约 80 移动 反射ShapeBufferGeometry在一个场景中 我希望他们分享尽可能多的材料数据 显然 clone 该方法不适用于Reflector 我得到的黑色几何图形不反射任何东西 尝试添加一个clone 方法到prot
  • Python ABC:注册与子类化

    我使用的是 python 2 7 python 文档表明您可以将映射传递给内置的 dict 它将将该映射复制到新的 dict 中 http docs python org library stdtypes html mapping type
  • 在 OS X El Capitan 10.11 中复制 root 下的文件失败

    我正在尝试将根文件复制到 System 文件夹中 它适用于所有以前的 OS X 版本 但不适用于 El Capitan 10 11 这是我在终端的根目录下复制文件的方法 MACMINI myusername sudo su MACMINI
  • Django 通过多对多中间表中的多个字段进行过滤

    我的 django 项目中有以下模型 class Video models Model media models ForeignKey Media class Media models Model title models CharFiel
  • 成员函数指针从派生类到基类的强制转换

    我正在执行以下操作 获取成员函数指针3 params from a 派生类 将其转换为成员函数指针基类 with 0 params 将其投射到基类 with 3个参数 back 呼唤着它 它工作得很好 到目前为止 但我应该保留它吗 当前代码
  • 'current_user' 在rails_admin 中未定义且有权限

    我一直在使用rails admin v0 7 0 并成功完成了清除gem 我今天尝试将 Rails admin 更新到 v1 0 但收到未定义的变量或方法错误current user 在 v0 7 0 中似乎RailsAdmin MainC
  • 使用 PIL 修剪扫描图像?

    修剪使用扫描仪输入的图像并因此具有较大的白色 黑色区域的方法是什么 熵解似乎有问题并且计算过于密集 为什么不进行边缘检测 我刚刚编写了这段 python 代码来为自己解决同样的问题 我的背景是肮脏的白色 所以我使用的标准是黑暗和颜色 我简化