我试过这个代码。
import sys
import numpy as np
sys.path.append('/usr/local/lib/python2.7/site-packages')
import cv2
from cv2.cv import *
img=cv2.imread("test2.jpg",cv2.IMREAD_COLOR)
gimg = cv2.imread("test2.jpg",cv2.IMREAD_GRAYSCALE)
b,g,r = cv2.split(img)
ret,thresh1 = cv2.threshold(gimg,127,255,cv2.THRESH_BINARY);
numrows = len(thresh1)
numcols = len(thresh1[0])
thresh = 170
im_bw = cv2.threshold(gimg, thresh, 255, cv2.THRESH_BINARY)[1]
trig=0
trigmax=0;
xmax=0
ymax=0
for x in range(0,numrows):
for y in range(0,numcols):
if(im_bw[x][y]==1):
trig=trig+1;
if(trig>5):
xmax=x;
ymax=y;
break;
print x,y,numrows,numcols,trig
roi=gimg[xmax:xmax+200,ymax-500:ymax]
cv2.imshow("roi",roi)
WaitKey(0)
这里test2.jpg是我特灵做的是集中在图像的高强度部分(即图像中具有高强度的圆圈)。但我的代码似乎没有这样做。有人能帮忙吗?
3条答案
按热度按时间h22fl7wq1#
我从here找到了问题的答案
这是我的代码
test2.jpg
ROI
xmd2e60i2#
试着检查一个像素是否不为零--结果是这些像素在阈值处理后的值为255,因为它毕竟是灰度图像。
阈值似乎也是错误的,但我真的不知道你想看到什么(用imshow显示它-它不仅仅是圆圈)。你的代码匹配左下角的数字'3',因此ROI矩阵索引在你的例子中是无效的。
编辑:
在对图像进行处理之后,我最终使用了一种不同的方法。我使用了SimpleBlobDetector,并在之前对图像进行了侵 eclipse ,因此您感兴趣的区域保持连接。对于blob检测器,程序首先反转图像。(您可能想像我一样阅读SimpleBlobDetector tutorial,部分代码基于该页面-非常感谢作者!)
以下代码将逐步显示该过程:
该算法将坐标(454,377)作为斑点的中心,但是如果将minArea减小到例如10,则它也将在底部角落中找到数字3。
xqkwcwgp3#
我正在使用类似的东西,但我遇到了一些问题,使用上述答案。使用建议的裁剪有一些问题:
因为具有最大强度值的索引可以在图像的边缘。因此,-250或+250可能会超出图像形状的索引。如果你想泛化,这可能是一个更好的选择:
我希望这对你有帮助:)