Python 图像处理方法
在下面的灰度图中,我试图识别手动标记为红色的对象。有人对如何做到这一点有什么建议吗Python 图像处理方法,python,image-processing,image-segmentation,imagej,Python,Image Processing,Image Segmentation,Imagej,在下面的灰度图中,我试图识别手动标记为红色的对象。有人对如何做到这一点有什么建议吗 我尝试使用高斯模糊和阈值,但不能完全识别这些粒子。边缘检测是一种好方法吗?欢迎您提出任何建议。我只是使用ImageMagick从命令行快速尝试了一下。我相信通过查看检测到的斑点的方正度可以改进它,但我没有无限的时间,你说欢迎任何想法 首先,我对图像进行阈值处理,然后用水平行中的最大像素替换每个像素,左右各看6个像素——这是将每个咖啡豆形状的两半连接在一起。命令如下: convert http://i.stac
我尝试使用高斯模糊和阈值,但不能完全识别这些粒子。边缘检测是一种好方法吗?欢迎您提出任何建议。我只是使用ImageMagick从命令行快速尝试了一下。我相信通过查看检测到的斑点的
方正度
可以改进它,但我没有无限的时间,你说欢迎任何想法
首先,我对图像进行阈值处理,然后用水平行中的最大像素替换每个像素,左右各看6个像素——这是将每个咖啡豆形状的两半连接在一起。命令如下:
convert http://i.stack.imgur.com/mr0OM.jpg -threshold 80% -statistic maximum 13x1 w.jpg
看起来是这样的:
convert http://i.stack.imgur.com/mr0OM.jpg \
-threshold 80% -statistic maximum 13x1 \
-define connected-components:verbose=true \
-define connected-components:area-threshold=500 \
-connected-components 8 -auto-level output.png
Objects (id: bounding-box centroid area mean-color):
0: 1280x1024+0+0 642.2,509.7 1270483 srgb(4,4,4)
151: 30x303+137+712 152.0,863.7 5669 srgb(255,255,255)
185: 29x124+410+852 421.2,913.2 2281 srgb(255,255,255)
43: 48x48+445+247 467.9,271.5 1742 srgb(255,255,255)
35: 21x94+234+214 243.7,259.2 1605 srgb(255,255,255)
10: 52x49+183+31 209.9,56.2 1601 srgb(255,255,255)
30: 31x86+504+176 523.1,217.2 1454 srgb(255,255,255)
171: 61x39+820+805 856.0,825.7 1294 srgb(255,255,255)
119: 20x78+1212+625 1221.6,664.3 1277 srgb(255,255,255)
17: 44x40+587+106 608.3,124.9 1267 srgb(255,255,255)
94: 19x70+1077+545 1086.1,580.6 1100 srgb(255,255,255)
59: 43x33+947+329 967.4,344.3 1092 srgb(255,255,255)
40: 39x32+735+235 754.4,251.0 1074 srgb(255,255,255)
91: 22x62+1258+540 1268.3,571.0 1045 srgb(255,255,255)
18: 23x50+197+124 207.1,148.1 996 srgb(255,255,255)
28: 40x28+956+165 976.8,177.7 970 srgb(255,255,255)
76: 22x55+865+467 875.6,493.8 955 srgb(255,255,255)
187: 18x59+236+858 244.4,886.4 928 srgb(255,255,255)
211: 46x27+720+997 743.8,1009.0 891 srgb(255,255,255)
206: 19x47+418+977 427.5,1000.5 804 srgb(255,255,255)
57: 21x44+231+313 241.4,335.5 769 srgb(255,255,255)
97: 20x45+1215+553 1224.3,574.3 766 srgb(255,255,255)
52: 19x47+516+293 525.4,316.2 752 srgb(255,255,255)
129: 20x41+18+645 28.2,665.1 746 srgb(255,255,255)
83: 21x45+1079+497 1088.1,518.9 746 srgb(255,255,255)
84: 17x44+636+514 644.0,535.7 704 srgb(255,255,255)
62: 19x43+514+348 523.3,369.3 704 srgb(255,255,255)
201: 19x42+233+951 242.3,971.8 675 srgb(255,255,255)
134: 21x39+875+659 884.3,676.9 667 srgb(255,255,255)
194: 25x32+498+910 509.5,924.6 625 srgb(255,255,255)
78: 19x38+459+483 467.8,501.8 622 srgb(255,255,255)
100: 20x37+21+572 30.6,589.4 615 srgb(255,255,255)
53: 18x37+702+296 710.5,314.5 588 srgb(255,255,255)
154: 18x37+1182+723 1191.2,741.3 566 srgb(255,255,255)
181: 47x18+808+842 827.6,850.4 565 srgb(255,255,255)
80: 19x33+525+486 534.2,501.9 544 srgb(255,255,255)
85: 17x34+611+517 618.9,533.4 527 srgb(255,255,255)
203: 21x31+51+960 60.5,974.6 508 srgb(255,255,255)
177: 19x30+692+827 700.7,841.5 503 srgb(255,255,255)
然后,我在上面添加了一个连接组件分析,以查找blob,如下所示:
convert http://i.stack.imgur.com/mr0OM.jpg \
-threshold 80% -statistic maximum 13x1 \
-define connected-components:verbose=true \
-define connected-components:area-threshold=500 \
-connected-components 8 -auto-level output.png
Objects (id: bounding-box centroid area mean-color):
0: 1280x1024+0+0 642.2,509.7 1270483 srgb(4,4,4)
151: 30x303+137+712 152.0,863.7 5669 srgb(255,255,255)
185: 29x124+410+852 421.2,913.2 2281 srgb(255,255,255)
43: 48x48+445+247 467.9,271.5 1742 srgb(255,255,255)
35: 21x94+234+214 243.7,259.2 1605 srgb(255,255,255)
10: 52x49+183+31 209.9,56.2 1601 srgb(255,255,255)
30: 31x86+504+176 523.1,217.2 1454 srgb(255,255,255)
171: 61x39+820+805 856.0,825.7 1294 srgb(255,255,255)
119: 20x78+1212+625 1221.6,664.3 1277 srgb(255,255,255)
17: 44x40+587+106 608.3,124.9 1267 srgb(255,255,255)
94: 19x70+1077+545 1086.1,580.6 1100 srgb(255,255,255)
59: 43x33+947+329 967.4,344.3 1092 srgb(255,255,255)
40: 39x32+735+235 754.4,251.0 1074 srgb(255,255,255)
91: 22x62+1258+540 1268.3,571.0 1045 srgb(255,255,255)
18: 23x50+197+124 207.1,148.1 996 srgb(255,255,255)
28: 40x28+956+165 976.8,177.7 970 srgb(255,255,255)
76: 22x55+865+467 875.6,493.8 955 srgb(255,255,255)
187: 18x59+236+858 244.4,886.4 928 srgb(255,255,255)
211: 46x27+720+997 743.8,1009.0 891 srgb(255,255,255)
206: 19x47+418+977 427.5,1000.5 804 srgb(255,255,255)
57: 21x44+231+313 241.4,335.5 769 srgb(255,255,255)
97: 20x45+1215+553 1224.3,574.3 766 srgb(255,255,255)
52: 19x47+516+293 525.4,316.2 752 srgb(255,255,255)
129: 20x41+18+645 28.2,665.1 746 srgb(255,255,255)
83: 21x45+1079+497 1088.1,518.9 746 srgb(255,255,255)
84: 17x44+636+514 644.0,535.7 704 srgb(255,255,255)
62: 19x43+514+348 523.3,369.3 704 srgb(255,255,255)
201: 19x42+233+951 242.3,971.8 675 srgb(255,255,255)
134: 21x39+875+659 884.3,676.9 667 srgb(255,255,255)
194: 25x32+498+910 509.5,924.6 625 srgb(255,255,255)
78: 19x38+459+483 467.8,501.8 622 srgb(255,255,255)
100: 20x37+21+572 30.6,589.4 615 srgb(255,255,255)
53: 18x37+702+296 710.5,314.5 588 srgb(255,255,255)
154: 18x37+1182+723 1191.2,741.3 566 srgb(255,255,255)
181: 47x18+808+842 827.6,850.4 565 srgb(255,255,255)
80: 19x33+525+486 534.2,501.9 544 srgb(255,255,255)
85: 17x34+611+517 618.9,533.4 527 srgb(255,255,255)
203: 21x31+51+960 60.5,974.6 508 srgb(255,255,255)
177: 19x30+692+827 700.7,841.5 503 srgb(255,255,255)
这显示了它发现的所有斑点,它们的边界和质心。然后,我让ImageMagick将检测到的框绘制到您的图像上,如下所示:
为了解释输出,每行代表一个blob。让我们看第二行,它是:
151: 30x303+137+712 152.0,863.7 5669 srgb(255,255,255)
这意味着blob宽30像素,高303像素,距离图像左侧137像素,距离顶部712像素。因此,它基本上是图像左下角最高的绿色框。152863是其质心的x、y坐标,面积为5669像素,颜色为白色
正如我所说的,它可以被改进,可能是通过观察斑点的边的比率来找到正方形,但它可能会给你一些想法。顺便问一下,你能说出这些斑点是什么吗?我给出了以下alg。在对OP的问题的评论中,但这只是一个简短的片段,所以为什么不用python给出opencv的书面答案呢 希望这比MarkSetchell的答案更具可扩展性,并且更符合OP的标签
import cv2
import numpy as np
img = cv2.imread("a.jpg", cv2.IMREAD_GRAYSCALE)
ret,thresh = cv2.threshold(img,127,255,0)
contours,hierarchy = cv2.findContours(thresh, 1, 2)
#color image for testing purposes
color = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
for cnt in contours:
x,y,w,h = cv2.boundingRect(cnt)
if w>h: delta = w/h
else: delta = h/w
if delta<4 and w>10 and h>10:
cv2.rectangle(color,(x,y),(x+w,y+h),(0,0,255),2)
cv2.imwrite("c.jpg", color)
祝你好运,康普。愿景需要很多努力才能让它按你想要的方式运作。慢慢来,阅读手册。重叠的东西将很难设置为appart,因为我们正在尽最大努力将它们作为一个单一对象组合在一起
如果可以使咖啡豆显示为圆形,可以尝试使用
houghcirle
检测。但是看到它们是多么的不规则,我不确定这是最好的方法。训练自己的haar cascade可能是你最好的选择,但我以前从未这样做过,所以在这方面我帮不了多少忙 您的图像看起来像是机器学习的合适目标
- 我使用for ImageJ/Fiji创建了以下概率图(将您的第二张图像作为输入):
- 你可能也想试试,一个免费的软件 将像素分类和对象跟踪与所有 机器学习的力量
谢谢你的建议。我已经研究了许多解决这个问题的方法,我得到的最好结果是使用opencv和haar-like特征级联分类 我遵循本教程,并获得了较高的准确性: 以下是前两幅图像的结果,通过对分类器进行一些优化,可以进一步改进:
在opencv中有一些很好的过滤器,可以使用各种阈值技术。还有很多文档和示例。我想没有办法通过改变曝光/灯光来改善图像本身?还有,有多少图像?你想达到什么目的:计算物体的数量,获得坐标?我想霍夫变换可以帮助你定位直线和/或椭圆(至少在我看来,它们是椭圆的)。谢谢你的评论。当然,我会看看OpenCV提供了什么。在现阶段,没有任何方法可以改善图像本身。这是一个1000多帧的视频中的一帧,我正在尝试计数对象并获得坐标,然后将帧之间的对象链接起来并获得关于轨迹的信息。对于这一点,Hough变换不会给出很好的结果purpose@WillyWonka1964; 如果我是你,我会使用
findContours
,然后在它们上安装minareact
。如果你的图像只有长线和斑点,你应该可以很容易地使用得到的矩形边长来检查它们的比例是否在一定范围内。对于较长/较短的线,比率将是一个较大的数字,而对于块状对象,比率将接近1。我还建议你放大
和/或腐蚀
你的图像,以消除噪音,使斑点组合在一个物体中,并尽量避免为每个斑点装配几个较小的矩形。这真是太好了!这是一个优雅的解决方案,与我使用ImageJ获得的结果类似(尽管我更喜欢您的Python实现)。在视频的后期帧中,白色条纹有时会覆盖“咖啡豆”状的颗粒,这可能是个问题。我将发布另一张图片作为示例。霍维夫