Правильный выбор структурного элемента

Я создаю программу для автоматического отделения солнечных элементов от фотоэлектрического модуля, для которого я сначала установил пороговое значение изображения, используя адаптивный порог, чтобы получить следующее изображение.

Пороговое изображение

После чего я намереваюсь удалить черные пиксели в границах ячеек, используя расширение, для которого я использовал эллиптический элемент структурирования размера (10,10) и получил следующее изображение

Пороговое изображение после расширения (размер элемента структурирования (10,10)

Как вы можете видеть, осталось еще несколько черных пикселей, теперь, если я увеличу размер элемента структурирования, я потеряю границы ячеек.

Пороговое изображение после расширения (размер элемента структурирования (15,15)

Я пробовал другие доступные элементы структурирования, такие как крест и прямоугольник, без какого-либо успеха, поэтому мне нужно было бы определить собственное ядро, и я не знаю, как мне его определить.

import numpy as np
import cv2
img=cv2.imread('result2.jpg',0)
th1 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
cv2.THRESH_BINARY,25,-2)
kernel=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(15,15))
closing = cv2.morphologyEx(th1, cv2.MORPH_CLOSE, kernel)
cv2.imwrite('closing.jpg',closing)
cv2.imwrite('threshold.jpg',th1)
cv2.waitKey(0)
cv2.destroyAllWindows()

Исходное изображение до порогового значения


person CS Thakur    schedule 09.03.2018    source источник
comment
Я добавил исходное изображение   -  person CS Thakur    schedule 10.03.2018


Ответы (1)


Мой первый совет — не ставить порог сразу. Порог — это то, что вы хотите сделать в конце. Пороговое значение выбрасывает ценную информацию. Морфологические операции работают и с изображениями в оттенках серого!

Выбор правильных морфологических операторов для сохранения только интересующих вас форм на самом деле довольно интуитивен. В этом случае вы хотите сохранить как горизонтальные, так и вертикальные линии. Воспользуемся элементами структурирования строк. Линии темные, поэтому мы используем закрытие, чтобы удалить то, что не похоже на наши линии.

Закрытие вертикальными линиями удалит все горизонтальные линии, а закрытие горизонтальными линиями удалит все вертикальные линии. Так как же совместить эти два? Получается, что инфимум (минимум по пикселям) двух замыканий также является замыканием. Таким образом, инфимум закрытия с вертикальными линиями и одного с горизонтальными линиями - это закрытие с двумя линиями одновременно, вы сохраните формы, где подходит любая из этих двух линий.

Вот пример. Я использую PyDIP (у меня нет OpenCV).

import PyDIP as dip
img = dip.ImageReadTIFF('/Users/cris/Downloads/ZrF7k.tif')
img = img.TensorElement(1) # keep only green channel
img = img[0:-2,1:-1]       # let's remove the artifacts at the right and top edges
f1 = dip.Closing(img, dip.SE([50,1],'rectangular'))
f2 = dip.Closing(img, dip.SE([1,50],'rectangular'))
out = dip.Infimum(f1, f2)
out.Show('lin')

введите здесь описание изображения

Вы можете попробовать немного изменить это и добавить некоторую дополнительную обработку, а также добавить адаптивную пороговую настройку в конце, чтобы получить края ячеек PV. Но на самом деле есть гораздо лучший способ найти их.

Я пользуюсь здесь тем фактом, что панель очень прямая по сравнению с изображение, и что оно охватывает все изображение. Мы можем просто взять среднюю проекцию по строкам и по столбцам:

x = dip.Mean(out, process=[1, 0]).Squeeze()
y = dip.Mean(out, process=[0, 1]).Squeeze()
import matplotlib.pyplot as pp
pp.subplot(2,1,1)
pp.plot(x)
pp.subplot(2,1,2)
pp.plot(y)
pp.show()

введите здесь описание изображения

Обнаружение краев ячеек по этим проекциям должно быть довольно простым.

person Cris Luengo    schedule 10.03.2018
comment
Желоба будут соответствовать границам ячеек, поэтому мне потребуется 13 желобов, соответствующих столбцам, и 7 желобов, соответствующих строкам, поскольку есть 12 ячеек вдоль столбцов и 6 ячеек вдоль строк. Эти желоба будут локальными минимумами, пожалуйста, поправьте меня, если я ' я ошибаюсь - person CS Thakur; 10.03.2018
comment
@ChirayuThakur да, это имеет смысл. Вам нужно будет выбрать локальные минимумы с самым высоким контрастом, не обязательно с самыми низкими значениями. Но некоторые формы локального усиления контраста могут облегчить эту задачу. Вы также можете увеличить длину горизонтальной линии SE, чтобы улучшить разницу между желаемым и нежелательным минимумом. - person Cris Luengo; 10.03.2018