Как обнаружить объект на изображении, где объект и фон имеют очень похожие цвета?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как обнаружить объект на изображении, где объект и фон имеют очень похожие цвета?

Сообщение Anonymous »

У меня есть изображение, на котором объект имеет цвет, очень похожий на цвет фона. Я хочу обнаружить этот объект на изображении и сделать его белым, а фон черным.
[img]https://i.stack. imgur.com/I0klu.jpg[/img]

Я пытался подумать о решении, но не нашел его. Я пытался преобразовать в оттенки серого, а затем выровнять гистограмму с помощью cv2.equalizeHist, я пытался обнаружить края с помощью cv2.Canny, а также пытался изменить каналы HSV, но у меня нет в этом опыта, поэтому я Я не уверен, поможет ли это и как мне это сделать. Одна вещь, которая делает объект более заметным, — это CLAHE:

Код: Выделить всё

import cv2
import tkinter.filedialog as fd

def main():
filepath = fd.askopenfilename()
image = cv2.imread(filepath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
clahe = cv2.createCLAHE(clipLimit=5)
cla = clahe.apply(gray)
cv2.imshow("Image", cla)
cv2.waitKey(0)
cv2.destroyAllWindows()

main()
Но опять же, я не знаю, как продолжить обработку изображения, чтобы иметь возможность обнаружить объект. Как я мог это обнаружить?
РЕДАКТИРОВАТЬ:
Ответ @Christoph Rackwitz великолепен, но я также нашел другой способ найти объект с помощью методы обработки изображений. Вот код:

Код: Выделить всё

import cv2
import numpy as np
import tkinter.filedialog as fd

def bilateral_filter(image):
return cv2.bilateralFilter(image, 30, 75, 175)

def enhance_image(image, h_luminance, photo_render, block_size, search_window, gamma):
denoised_image = cv2.fastNlMeansDenoisingColored(image, None, h_luminance, photo_render, block_size, search_window)
contrast_stretched_image = cv2.normalize(denoised_image, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8UC1)
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)
sharpened_image = cv2.filter2D(contrast_stretched_image, -1, kernel=kernel)
improved_exposure = cv2.convertScaleAbs(sharpened_image, alpha=1, beta=5)
lookup_table = np.array([((i / 255.0) ** gamma) * 255 for i in np.arange(0, 256)]).astype("uint8")
gamma_corrected_image = cv2.LUT(improved_exposure, lookup_table)
return gamma_corrected_image

def convert_to_grayscale(image):
return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

def black_and_white(image):
return cv2.threshold(image, 0, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)[1]

def dilation(image, iter, ksize):
kernel = np.ones((ksize, ksize), np.uint8)
return cv2.dilate(image, kernel, iterations=iter)

def erosion(image, iter, ksize):
kernel = np.ones((ksize, ksize), np.uint8)
return cv2.erode(image, kernel, iterations=iter)

def closing(image, ksize):
kernel = np.ones((ksize, ksize), np.uint8)
return cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)

def sobel_filter(image):
ddepth = cv2.CV_64F
ksize = cv2.FILTER_SCHARR
x = cv2.Sobel(image, ddepth, 1, 0, ksize=ksize, scale=1)
y = cv2.Sobel(image, ddepth, 0, 1, ksize=ksize, scale=1)
absx = cv2.convertScaleAbs(x)
absy = cv2.convertScaleAbs(y)
sobel_image = cv2.addWeighted(absx, 0.5, absy, 0.5, 0)
return sobel_image

def use_clahe(grayscale_image, cliplimit):
clahe = cv2.createCLAHE(clipLimit=cliplimit)
cla = clahe.apply(grayscale_image)
return cla

def process_image(image):
contour_image = image.copy()
sobel_image = sobel_filter(image)
bilateral_image = bilateral_filter(sobel_image)
h_luminance, photo_render, block_size, search_window, gamma = 7, 10, 6, 55, 5
enhanced_image = enhance_image(bilateral_image, h_luminance, photo_render, block_size, search_window, gamma)
grayscale_image = convert_to_grayscale(enhanced_image)
clahe_process = use_clahe(grayscale_image, 20)
thres = black_and_white(clahe_process)
closed = closing(thres, 20)
dilated = dilation(closed, 2, 2)
eroded = erosion(dilated, 1, 4)
processed_image = dilation(eroded, 2, 6)
contours, _ = cv2.findContours(processed_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
cv2.drawContours(contour_image, [contour], -1, [0, 0, 255], 2)
return processed_image, contour_image

def show_image(texts, images):
for i, image in enumerate(images):
cv2.imshow("{}".format(texts[i]), image)
cv2.waitKey(0)
cv2.destroyAllWindows()

def main():
filepath = fd.askopenfilename()
image = cv2.imread(filepath)
processed_image, contour_image = process_image(image)
texts = ["Image 1: Original", "Image 2: Processed", "Image 3: Contours"]
images = [image, processed_image, contour_image]
show_image(texts, images)
quit()

main()
Идея состоит в том, чтобы отфильтровать и улучшить изображение с помощью фильтров и CLAHE. Затем я применяю морфологические операции к черно-белому изображению. Однако это работает не идеально, и контур немного смещен, как вы можете видеть: Результат. Так что это лучше, чем ничего, и есть много возможностей для улучшения. Я пытаюсь улучшить этот код, а также работаю над методом @Christoph Rackwitz, и я опубликую больше, если получу лучшие результаты.

Подробнее здесь: https://stackoverflow.com/questions/783 ... e-very-sim
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Очень похожие функции имеют заметно разное время выполнения.
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Очень похожие функции имеют заметно разное время выполнения.
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Голова скретчик: 2 очень похожие запросы MySQL с очень разными производительность
    Anonymous » » в форуме MySql
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • 2 очень похожие запросы MySQL с очень разной производительностью
    Anonymous » » в форуме MySql
    0 Ответы
    34 Просмотры
    Последнее сообщение Anonymous
  • Попытка удалить фон белого цвета, чтобы обнаружить другие цвета с помощью Halcon.
    Гость » » в форуме CSS
    0 Ответы
    99 Просмотры
    Последнее сообщение Гость

Вернуться в «Python»