概述
我对R并不陌生,但对机器学习却很陌生。
对于工作,我通过写在防水纸上打印的数据表上来收集数据,然后我必须手动将其抄录到数据库中。在漫长的一天结束时,这会花费很长时间,并且很容易出错。
整个数据表如下所示
我想做的就是简单地拍摄一张纸的照片,让keras阅读并将结果输入数据库中
这里显示了我感兴趣的吸引Keras阅读的数据表部分
数据表的每一行代表发现了哪种珊瑚,每一列代表了在其上发现的横断面,即在T1处发现了7种Acroppora
在这些单元格中的每个单元格都以类似于此格式的格式在数据库中分配了唯一的条目,该格式将显示如何记录Acropora行
对于我们过去输入的每个数据表(可能在1000到2500之间),都有对应的数据库条目,可以将其导出到csv并链接到每个数据表
最终,我想做的就是简单地拍摄一张纸的照片,让keras阅读我感兴趣的部分(如第二幅图像所示),并将结果输入到CSV中,格式与第三张图片
问题
我一直在想的是让它识别出我感兴趣的数据表各部分的边界(如第二幅图所示)并提取出来。这意味着我可以输入每个单元格的坐标,即Acropora T1(如下图所示),确定该单元格中的计数并将其导出到数据库中。
这个过程听起来可行吗?如果是这样,有人会知道我可以查找的任何示例,甚至您会称呼此过程的什么,以便我可以查找
否则我会考虑整体扫描每张纸(如第一张图所示),然后从中进行训练,但是我认为这样更容易出错
我真的希望这是有道理的,非常感谢您对我所问的问题或总体上有关我的项目的任何帮助和/或建议
答案 0 :(得分:1)
这使用OpenCV和Python。
根据“ Hough Line Transform”一章,您可以检测到这样的行。
import cv2
import numpy as np
img = cv2.imread('D:/Books/lines1.jpg', cv2.IMREAD_GRAYSCALE)
edges = cv2.Canny(img,50,150,apertureSize = 3)
cv2.imwrite('D:/Books/edges.jpg',edges)
但是根据我的简单研究,我认为使用这样的代码可以计数。
在此阶段需要更多有关OpenCV的知识。我认为这只是扩张,线条的边界更加明显。
img = cv2.imread('D:/Books/lines1.jpg', cv2.IMREAD_GRAYSCALE)
edges = cv2.Canny(img,50,150,apertureSize = 3)
cv2.imwrite('D:/Books/edges.jpg',edges)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (4, 4))
dilated_Edges = cv2.dilate(edges, kernel, iterations=1)
cv2.imwrite("D:/Books/dilated_Edges.jpg", dilated_Edges);
lines = cv2.HoughLines(image=dilated_Edges,rho=1,theta=np.pi/180, threshold=100)
print( len(lines))
这会为我打印8
,这是不正确的。
我追求了这一点,并且此代码基于OpenCV论坛(Suleyman TURKMEN)的帮助。
我测试过的图像是这些。打印正确的计数。
import cv2
import math
img = cv2.imread('D:/Books/lines1.jpg', cv2.IMREAD_GRAYSCALE)
ret,bw = cv2.threshold(img,0,255,cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
cv2.imshow("bw", bw)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 2))
eroded_Edges = cv2.erode(bw, kernel, iterations=3)
dilated_Edges = cv2.dilate(eroded_Edges, kernel, iterations=4)
im2, contours, hierarchy = cv2.findContours(dilated_Edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
print (len(contours) , " horizontal lines")
cv2.imshow("vertical lines", eroded_Edges)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (1, 5))
eroded_Edges = cv2.erode(bw, kernel, iterations=3)
im2, contours, hierarchy = cv2.findContours(eroded_Edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
print (len(contours) , " vertical lines")
cv2.imshow("horizontal lines", eroded_Edges)
cv2.waitKey()