使用 python 检测药丸上的雕刻印记

engraved imprint detection on pills using python

import cv2
import pytesseract
from PIL import Image
import numpy as np
# import bm3d
img = cv2.imread('1_2_2.png')
# img = cv2.medianBlur(img, 5)
img = cv2.GaussianBlur(img,(13,13),0)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# gray = cv2.medianBlur(, 5)
# cv2.imshow("img", gray)
# gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | 
cv2.THRESH_OTSU) 
[1]
v = np.median(gray)
sigma = 0.33
#---- apply automatic Canny edge detection using the computed median-- 
--
lower = int(max(0, (1.0 - sigma) * v))
upper = int(min(255, (1.0 + sigma) * v))
gray = cv2.Canny(img,lower,upper)
# ret,gray = cv2.threshold(gray,110,255,cv2.THRESH_BINARY)
kernel = np.ones((4,4),np.uint8)
gray = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)
gray = cv2.dilate(gray,kernel,iterations = 1)
# gray = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel)\
# gray = cv2.erode(gray,kernel,iterations = 1)
gray = cv2.bitwise_not(gray)
cv2.imshow("threshold", gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
# gray = cv2.medianBlur(gray, 3)
text = pytesseract.image_to_string(gray)
print(text)

我正在尝试代码中提到的一些图像处理,但无法获得 pytesseract 可以检测到的图像。
请帮助是否已完成任何检测雕刻的工作

seen that stack overflow link but did't get the proper idea

请注意:这只是入门代码。你可以玩弄它,它还涉及很多 threshold 值,你需要试验一下。当然这不是最好的代码,但您可以将其作为起点。

我将简要概述以下步骤,并在之后提供 python 代码以及它在每个步骤中生成的 output

  • 加载灰度图像
  • 使用较大的 kernel size 执行 自适应阈值 。这是 重要的是执行自适应阈值,而不是一些全局 阈值,因为它考虑了相邻的强度,这 在您提供的示例图像中起着重要作用。
  • 执行中值模糊以去除椒盐噪声
  • 找到面积相当大的连通分量,去掉 最终图像中的小岛噪声
  • 将最终的 轮廓 绘制到输出图像中。

下面提供了实现此目的的 python 代码:

import cv2
import numpy as np

image = cv2.imread('test.png')
output = np.zeros((image.shape[0],image.shape[1],3), np.uint8)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
threshold = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C  , cv2.THRESH_BINARY, 11, 1)

median = cv2.medianBlur(threshold, 11)
median = cv2.bitwise_not(median)

im2, contours, hierarchy = cv2.findContours(median,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

saved_cont = []
thresh = 100

for contour in contours:
    if cv2.contourArea(contour) > thresh:
        print(cv2.contourArea(contour))
        saved_cont.append(contour)

cv2.drawContours(output, saved_cont,-1,(255,255,255),1)

cv2.imshow('original', gray)
cv2.imshow('threshold', threshold)
cv2.imshow('median', median)
cv2.imshow('contour', output)

cv2.imwrite("threshold.png", threshold)
cv2.imwrite("median.png", median)
cv2.imwrite("output.png", output)

cv2.waitKey(0)
cv2.destroyAllWindows()

原图:

阈值图像:

中值模糊图像:

最终输出:

您可能想要试验的其他一些形态学操作膨胀腐蚀开仓平仓操作。文档可以在 here.

上找到

这是一个典型的工业应用。

您的设置需要的是正确的照明: http://www.vision-doctor.com/en/illumination-techniques/dark-field-illumination.html 这是对它的解释。只需一点创意,您就可以在家里制作一个原型,例如,带有 LED 灯条的原型。

借助灰色形态,您可以加强暗区,以便更轻松地分割雕刻字母。

如果您下载 HALCON 的测试版本并在 HALCON IDE HDevelop 中对制药行业和 OCR 执行示例,最好的学习方法和方法。在示例中,您可以学习如何使用徽标匹配来获取药丸的方向。然后您可以将图像转换为水平方向以进行分割并执行 OCR。如果你没有任何标志,使用印记作为模型进行基于形状的匹配,然后转换图像,使字母水平​​定向,然后分割字母并进行OCR。 没有通用的配方,每个应用程序都是独一无二的。但是您可以从示例中学到很多东西来构建您自己的应用程序。

此致, 多萝西娅