使用 python 注释图像的最佳方法

Best Method to annotate Image using python

我正在尝试将文本框与红点对齐,但我不知道从哪里开始。任何 advice/examples 将不胜感激。

My image


我使用 skimage 和 peakutils 来获取阶梯带和泳道的位置,现在我想对它们进行注释

%matplotlib inline
import skimage
import numpy as np
import matplotlib.pyplot as plt 
from skimage import data
from skimage import io
from skimage.color import rgb2gray
from skimage.filters import threshold_otsu
from skimage.util import invert, crop
import peakutils
from peakutils.plot import plot as pplot
import pandas as pd
from scipy.misc import toimage
from skimage import feature

def ladder_peaks(image):
    image = io.imread(image)
    image_grey = rgb2gray(image)
    image_grey = invert(image_grey)
    image_otsu = threshold_otsu(image_grey)
    image_otsu = image_grey > image_otsu
    xi,yi = image_otsu.shape
    width_per_lane=int(xi/10)
    imagecopy_otsu = np.copy(image_otsu)
    imagecopy_otsu = imagecopy_otsu[:,0:(width_per_lane*2)]
    ladder_mean = imagecopy_otsu.mean(1)
    count = 0
    x = []
    for i in ladder_mean:
        x.append(count)
        count+=1
    x = np.asarray(x)
    indexes = peakutils.indexes(ladder_mean, thres=0.4, min_dist=80)
    indexes = indexes.tolist()
    origin = image
    for i in indexes:
        image[i:(i+30),0:30,:] = [255,0,0]
    io.imshow(image)

这里是如何在 opencv 中实现这一点的实现。我会尽可能多地解释。

导入必要的库。

import cv2
import numpy as np

现在打开文件供opencv读取

image = cv2.imread('images/red-dots.jpg')

保留原始副本,因为我们将处理第一张图片。

original_image = image

现在将颜色格式从默认的 BGR 转换为 RGB。这一步不是必须的,我鼓励你在 BGR 颜色格式中尝试这个作为练习。

image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

现在设置您的上限和下限,以帮助我们只关注红色调。

min_red= np.array([210, 0, 0])
max_red = np.array([255, 33, 33])

inRange 函数将使我们能够忽略超出我们限制的所有内容。

image_red = cv2.inRange(image, min_red, max_red )

运行 精明的过滤器;这将检测我们的边缘。

edged = cv2.Canny(image_red, 50, 200)

现在我们要生成轮廓,注意标志。我们只想要简单的轮廓。

contours, hierarchy = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

此函数将找到轮廓的质心。 cv2.moments 的 "magic" 让我们很容易做到这一点。接下来它在轮廓的质心位置周围放置文本。

def label_contour_center(image, c):
    # Places some text over the contours
        M = cv2.moments(c)
        cx = int(M['m10'] / M['m00'])
        cy = int(M['m01'] / M['m00'])
        cv2.putText(image, "#{}".format(i + 1), (cx, cy), cv2.FONT_HERSHEY_SIMPLEX, .3, (255,150,250), 1)
        return image

现在枚举函数将帮助我们跟踪我们存储了多少个轮廓。将 i 视为计数变量,将 c 视为包含每个单独轮廓数据的变量。

for i,c in enumerate(contours):
    orig = label_contour_center(original_image, c)

现在显示图像,并在键盘事件时销毁它。

cv2.imshow('Red dots', original_image)

cv2.waitKey(0)
cv2.destroyAllWindows()