2017-06-20 25 views
-3

我想將文本框與紅點對齊,但我不知道從哪裏開始。任何意見/例子,將不勝感激。使用python註釋圖像的最佳方法

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) 
+0

您已經列出了一些可能與您的問題相關的標籤。你有沒有開始任何代碼?如果我們通過代碼看到您的思考過程,則更容易理解您想要去的地方。 –

+0

歡迎來到StackOverflow。請閱讀並遵守幫助文檔中的發佈準則。 [關於主題](http:// stackoverflow。com/help/on-topic)和[如何提問](http://stackoverflow.com/help/how-to-ask)在這裏適用。 StackOverflow不是一個設計,編碼,研究或教程服務。 – Prune

+0

[「有人能幫助我嗎?」是不是一個有效的SO問題](https://meta.stackoverflow.com/questions/284236/why-is-can-someone-help-me-not-an-actual-question)。這通常表明,你需要的是半個小時的時間與當地的導師,或通過一個教程,而不是堆棧溢出。 – Prune

回答

0

下面是如何實現的實現這是在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) 

運行Canny過濾器;這將檢測我們的邊緣。

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

現在我們要生成我們的輪廓,請注意標誌。我們只想要簡單的輪廓。

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

此功能將查找輪廓的質心。 cv2.moments的「魔力」使我們很容易。接下來,它將圍繞輪廓質心位置放置文本。

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() 
+0

我遇到了類型問題,要使用它需要的圖像是ndarray,但是對於cv,它必須是dtype = int,否則我會得到TypeError數據= 17。唯一讓我困擾的地方是cv2.putText (image,「#{}」.format(i + 1),(cx,cy),cv2.FONT_HERSHEY_SIMPLEX,.3,(255,150,250),1) – Elijah

+0

運行'image.dtype',得到什麼類型? – avereux

+0

當我跑'np.dtype(original_image)'我得到int32 – Elijah