python - 快速循环像素numpy
问题描述
我想通过图像执行以下循环以删除或修改像素,如果它等于具有阈值的 rgb 值。
目标是去除图像的背景并将图像提供给 OCR。
我尝试了两种不同的方法来做到这一点。
方法一:
基本上我所做的是获得平均背景像素值。然后遍历所有像素并检查哪些像素等于平均背景像素。
for x in range(0, w):
for y in range(0, h):
if Pixel(img[y, x]).compare(pixel, threshold):
img[y, x] = 255
else
img[y, x] = 0
比较函数将检查它是否 >=/<= 像素 -/+ 阈值。然后如果它返回true,它会将像素更改为白色,否则将更改为黑色。
这很好用,但是当你使用更大的图片时它太慢了。
方法2:只需使用opencv方法去除背景。
简单地:
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
th3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 41, 2)
第一种方法是减慢速度,第二种方法仅在图像具有白色背景时才有效。
我确实需要它用于不同的背景颜色。
我发现了一些关于向量化 numpy 数组的东西。但真的找不到一个很好的例子。
解决方案
用具体的例子来回答这个问题:
#load an image as grayscale
#get the background average pixel value, it out of the scope of this question, different methods to achieve
bg_avg = get_bg_avg_px_val(img)
th = 80
background_mask = logical_and((bg_avg - th) <= img, img <= (bg_avg + th))
text_mask = logical_or((bg_avg - th) >= img, img >= (bg_avg + th))
img[selected] = 255
img[text] = 0
推荐阅读
- xamarin.forms - 发送对象列表作为导航参数
- apache-spark - 在将 PySpark 作业提交到 Google Dataproc 时从 requirements.txt 初始化虚拟环境
- mysql - AWS RDS、Lambda、API Gateway - 数据未返回到 API Gateway
- vhdl - 具有结构设计的 vhdl 中的多路复用器
- c++ - 关于函数中的局部变量(c++)
- java - 何时使用 ListPath (querydsl)?
- html - 在标签/路由器链接内垂直居中字体真棒图标和文本
- ajax - 关于在codeigniter 3中将会话用户数据设置为数据库的问题
- laravel - 如何在 4.2 中不使用 Mail::pretend() 从本地开发发送电子邮件?
- c - gcc 编译中不存在 program.h