用numpy递归地将图像中的黑色变为白色

时间:2015-08-03 07:38:16

标签: numpy image-processing

从灰度图像中删除大阴影区域的最佳方法是什么。我正在努力编写一个方法,在A中使用2d Numpy数组A和一个条目(x,y),并且"抓取"通过数组改变任何(x',y')条目" connected" to(x,y)从0到255.我所说的连接是指从(x,y)到(x',y')的0值条目的路径。这是我的意思的图片。

enter image description here

底部的黑色区域应全部设置为灰度255.我几乎是正面的,这个算法应该是递归的,有没有快速的方法在numpy中执行此操作,或使用PIL?

编辑:

好的感谢您的建议,这是我能够提出的建议;

08-03 18:08:21.627  22067-22067/com.example.tony.electricportal247 E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.tony.electricportal247, PID: 22067
    java.lang.IllegalStateException: Could not execute method of the activity
            at android.view.View$1.onClick(View.java:4247)
            at android.view.View.performClick(View.java:5191)
            at android.view.View$PerformClick.run(View.java:20916)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5972)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at android.view.View$1.onClick(View.java:4242)
            at android.view.View.performClick(View.java:5191)
            at android.view.View$PerformClick.run(View.java:20916)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5972)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.os.Bundle.get(java.lang.String)' on a null object reference
            at com.example.tony.electricportal247.CreatePDF.existingpdf(CreatePDF.java:172)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at android.view.View$1.onClick(View.java:4242)
            at android.view.View.performClick(View.java:5191)
            at android.view.View$PerformClick.run(View.java:20916)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5972)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

它似乎有点工作,除了它只返回行,而不是填写整个区域。

enter image description here

想想我太累了,无法正确理解这里的递归步骤。

2 个答案:

答案 0 :(得分:2)

正如@Boaz指出的更像是一个图像处理问题,而不是一个python问题。您可以使用所谓的自适应阈值来获得所需的结果。 Scikits-image有一个很好的实现,有一个完整的教程:

http://scikit-image.org/docs/dev/auto_examples/plot_threshold_adaptive.html

您需要稍微调整一下,但它应该可以正常工作。

答案 1 :(得分:0)

嗯 - 这不是真正的“python相关问题”更多的图像处理问题。

我认为你可以有两种选择:
1.使用边缘检测,然后迭代以查看该区域是否足够大 以Image outline using python/PIL为例 2.使用OpenCV。不太清楚 - 但是这段代码似乎做了一些与你想要达到的目标相近的东西 Python: detect black squares