如何识别图像中粗糙图案的偏差?

时间:2019-06-25 19:45:56

标签: python opencv

我正在尝试自动识别2-D原子片的TEM图像中的原子缺陷。这是我正在使用的东西:

原子缺陷图像:

enter image description here

enter image description here

这些是我希望能够识别出的原子缺陷(请注意,即使对于人类识别,其中一些缺陷也不明显,理想情况下,应该使用刻度盘来增加将某物识别为缺陷的可能性):

已识别的原子缺陷:

enter image description here

enter image description here

当前,我创建一个具有特定像素强度范围的蒙版,然后使用cv2.findContours尝试使用该蒙版标识缺陷的轮廓(下面的代码)。

但是,图像还捕获了原子薄片(薄片较轻的部分)上的氧化。因此,如果我尝试使用“绝对”颜色比较(如我以相同的亮度比例比较图像的每个区域),则原子薄板中具有氧化作用的原子缺陷(深色区域)(原子缺陷更亮)不那么容易识别。如果我更改常数以使这些原子缺陷可以通过代码识别,则原子片中不包含氧化的部分(因此图像的较暗部分)中的非原子缺陷将被识别为原子缺陷,因为它们恰好会变黑。

一个问题是,氧化会在纸张上以不同的强度(例如渐变)发生,并且不如识别氧化然后降低那些区域的亮度那么容易。

这是我到目前为止仅使用findContours的内容:

import cv2 as cv
import numpy as np

im = cv.imread("test4.png")
hsv = cv.cvtColor(im, cv.COLOR_BGR2HSV)
mask = cv.inRange(hsv, (0, 0, 22), (0, 0, 255))
contours, hierarchy = cv.findContours(mask, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

for c in contours:
    if cv.contourArea(c) > 48 and cv.contourArea(c) <100000:
      rect = cv.minAreaRect(c)
      box = cv.boxPoints(rect)
      box = np.int0(box)
      center = rect[0]
      size = (int(rect[1][0]), int(rect[1][1]))
      cv.drawContours(im, [box], 0, (0, 0, 255), 3)

cv.imshow("im", im)
cv.waitKey(0)
cv.destroyAllWindows()

我猜想,是否有任何OpenCV函数可以调整单个图像中的亮度差异?我所能找到的只是两个不同图像之间的比较。

0 个答案:

没有答案