Как подсчитать угловые точки в изображении заданного цвета

#python #opencv #image-processing #opencv-contour

Вопрос:

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

Входное изображение

Я использовал следующий код, но он определяет угол формы, а не цвет

 import cv2
import numpy as np
import matplotlib.pyplot as plt

def cornerpoint(img):
    img = cv2.imread(img)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray = np.float32(gray)
    dst = cv2.cornerHarris(gray,5,3,0.04)
    ret, dst = cv2.threshold(dst,0.1*dst.max(),255,0)
    dst = np.uint8(dst)
    ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst)
    criteria = (cv2.TERM_CRITERIA_EPS   cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001)
    corners = cv2.cornerSubPix(gray,np.float32(centroids),(5,5),(-1,-1),criteria)
    for i in range(1, len(corners)):
        print(corners[i])
    img[dst>0.1*dst.max()]=[0,0,0]
    plt.imshow(img)

cornerpoint('/content/shapes.png')
 

Как я могу продолжить подсчет угловых точек на изображении заданного цвета?

Комментарии:

1. получить только синий материал docs.opencv.org/3.4/da/d97/tutorial_threshold_inRange.html

2. Это реальное изображение или просто пояснительная диаграмма?

3. @YvesDaoust это реальное изображение, я хочу обработать это изображение

4. @Пятачок, но это похоже на панель отслеживания, я не хочу ее использовать

5. Фильтрация по цвету не слишком сложна (удалите все пиксели, которые не очень близки к чистому цвету).

Ответ №1:

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

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

  • Прочитайте входные данные
  • Изменить форму до одномерного изображения из 3 каналов
  • Используйте np.unique для получения цветов и количества
  • Zip цвета и количество
  • Поместите zip-файл в список
  • Сортируйте сжатый список по количеству в обратном порядке
  • Печатайте только те цвета, количество которых превышает некоторый порог.
  • (Примечание: другие фильтры могут использоваться для сопоставления цветов друг с другом, чтобы убедиться, что они не слишком близки, или для удаления цветов рядом с цветом фона. И т.д.)

Ввод:

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

 import cv2
import numpy as np

# read image
img = cv2.imread('colored_polygons.png')

# reshape img to 1 column of 3 colors
# -1 means figure out how big it needs to be for that dimension
img2 = img.reshape(-1,3)

# get the unique colors
colors, counts = np.unique(img2, return_counts=True, axis=0)

# zip colors, counts
unique = zip(colors,counts)

# make list of color, count
cc_list = []
for color, count in unique:
    cc_list.append((color, count))
    
# function to define key as second element (count)
def takeSecond(elem):
    return elem[1]

# sort cc_list on counts
cc_list.sort(key=takeSecond, reverse=True)

# print sorted list and threshold on count
index = 0
for item in cc_list:
    color = item[0]
    count = item[1]
    if count > 5000:
        index  = 1
        print("index:", index, "count:", count, "color:", color)
 

Список лучших уникальных цветов:

 index: 1 count: 428771 color: [255 255 255]
index: 2 count: 15735 color: [0 0 0]
index: 3 count: 9760 color: [ 14 127   0]
index: 4 count: 9160 color: [255  38   0]
index: 5 count: 8893 color: [  0   0 255]
 

Комментарии:

1. Спасибо за ваш ответ