2012-06-22 45 views
6

Tôi muốn phân đoạn hình ảnh (từ tạp chí) trong phần văn bản và hình ảnh. Tôi có một số biểu đồ cho một số ROI trong hình của tôi. Tôi sử dụng opencv với python (cv2).Cách nhận dạng biểu đồ có hình dạng cụ thể trong opencv/python

Tôi muốn nhận biểu đồ mà trông như thế này

http://matplotlib.sourceforge.net/users/image_tutorial-6.png

vì nó là một hình dạng đặc trưng cho một vùng văn bản. Làm thế nào tôi có thể làm điều đó?

Chỉnh sửa: Cảm ơn sự giúp đỡ của bạn cho đến thời điểm này.

Tôi đã so sánh biểu đồ tôi nhận được từ ROI của tôi để một biểu đồ mẫu tôi cung cấp:

hist = cv2.calcHist(roi,[0,1], None, [180,256],ranges) 
compareValue = cv2.compareHist(hist, samplehist, cv.CV_COMP_CORREL) 
print "ROI: {0}, compareValue: {1}".format(i,compareValue) 

Giả sử ROI 0, 1, 4 và 5 là vùng văn bản và ROI là một khu vực hình ảnh, tôi nhận được kết quả như này:

  • ROI: 0, compareValue: 1,0
  • ROI: 1, compareValue: -0,000195522081574 < --- sai phân loại
  • ROI: 2, compareValue: 0,0612670248952
  • ROI: 3, compareValue: -0,000517370176887
  • ROI: 4, compareValue: 1,0
  • ROI: 5, compareValue: 1,0

tôi có thể làm gì để tránh phân loại sai? Đối với một số hình ảnh, tỷ lệ phân loại sai là khoảng 30%, quá cao.

(Tôi cũng đã cố gắng với CV_COMP_CHISQR, CV_COMP_INTERSECT, CV_COMP_BHATTACHARYY và (hist * samplehist) .sum() nhưng họ cũng cung cấp compareValues ​​sai)

Trả lời

3

Bạn có thể sử dụng một sự tương quan đơn giản mét.

  • chắc chắn rằng histogram bạn tính toán và tài liệu tham khảo của bạn được chuẩn hóa (ví dụ đại diện probapilities)

  • cho mỗi tính toán biểu đồ (cho rằng myRef và myHist là mảng NumPy):

    metric = (myRef * myHist).sum()

  • số liệu này là thước đo mức độ biểu đồ giống như tham chiếu của bạn.

+0

đây là một ý tưởng thực sự thú vị. nhưng bạn có ý nghĩa gì bởi 'myRef'? có phải là một biểu đồ khác hoặc cùng kích thước với 'myHist'? hoặc là nó bất kỳ mảng numpy tùy ý? – samkhan13

+0

@ samkhan13 có, 'myRef' là biểu đồ mà chúng tôi muốn so sánh. – Simon

9

(Xem EDIT vào cuối trong trường hợp tôi hiểu lầm câu hỏi):

Nếu bạn đang tìm kiếm để vẽ biểu đồ, tôi đã đệ trình một mẫu python để OpenCV, và bạn có thể lấy nó từ ở đây:

http://code.opencv.org/projects/opencv/repository/entry/trunk/opencv/samples/python2/hist.py

Nó được sử dụng để vẽ hai loại biểu đồ.Hình ảnh đầu tiên áp dụng cho cả hình ảnh màu và thang độ xám như được hiển thị ở đây: http://opencvpython.blogspot.in/2012/04/drawing-histogram-in-opencv-python.html

Thứ hai là độc quyền cho hình ảnh thang độ xám giống như hình ảnh của bạn trong câu hỏi.

Tôi sẽ hiển thị điều chỉnh thứ hai và sửa đổi của nó.

Xem xét một hình ảnh đầy đủ như sau:

enter image description here

Chúng ta cần phải vẽ một biểu đồ như bạn đã được hiển thị. Kiểm tra mã bên dưới:

import cv2 
import numpy as np 

img = cv2.imread('messi5.jpg') 
mask = cv2.imread('mask.png',0) 
ret,mask = cv2.threshold(mask,127,255,0) 

def hist_lines(im,mask): 
    h = np.zeros((300,256,3)) 
    if len(im.shape)!=2: 
     print "hist_lines applicable only for grayscale images" 
     #print "so converting image to grayscale for representation" 
     im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 
    hist_item = cv2.calcHist([im],[0],mask,[256],[0,255]) 
    cv2.normalize(hist_item,hist_item,0,255,cv2.NORM_MINMAX) 
    hist=np.int32(np.around(hist_item)) 
    for x,y in enumerate(hist): 
     cv2.line(h,(x,0),(x,y),(255,255,255)) 
    y = np.flipud(h) 
    return y 

histogram = hist_lines(img,None) 

Và bên dưới là biểu đồ chúng tôi nhận được. Hãy nhớ nó là biểu đồ của hình ảnh đầy đủ. Cho rằng, chúng tôi đã đưa ra None cho mặt nạ.

enter image description here

Bây giờ tôi muốn tìm ra biểu đồ của một số phần của hình ảnh. Hàm biểu đồ OpenCV có một cơ sở mặt nạ cho điều đó. Đối với biểu đồ bình thường, bạn nên đặt nó None. Nếu không, bạn phải chỉ định mặt nạ.

Mặt nạ là hình ảnh 8 bit, trong đó màu trắng biểu thị vùng đó nên được sử dụng để tính toán biểu đồ và màu đen có nghĩa là không nên sử dụng.

Vì vậy, tôi đã sử dụng mặt nạ như dưới đây (được tạo bằng cách sử dụng sơn, bạn phải tạo mặt nạ cho mục đích của mình).

enter image description here

tôi đã thay đổi dòng cuối cùng của mã như dưới đây:

histogram = hist_lines(img,mask) 

Bây giờ thấy sự khác biệt dưới đây:

enter image description here

(Hãy nhớ rằng, giá trị này là bình thường, vì vậy giá trị được hiển thị không phải là số pixel thực tế, được chuẩn hóa thành 255. Thay đổi nó theo ý bạn.)

EDIT:

Tôi nghĩ rằng tôi đã hiểu nhầm câu hỏi của bạn. Bạn cần so sánh biểu đồ, đúng không?

Nếu đó là những gì bạn muốn, bạn có thể sử dụng chức năng cv2.compareHist.

Có hướng dẫn chính thức về this in C++. Bạn có thể tìm thấy tương ứng Python code here.

+0

Bạn nói đúng, tôi cần so sánh biểu đồ. – soet

+0

@Abid Rahman K. Chính xác sử dụng mặt nạ là gì? Tôi thấy một số chức năng đã nêu mặt nạ. Có một số loại mà chúng tôi có thể đặt ROI của hình ảnh không? – Mzk

+0

ya, thường là vùng hình chữ nhật, nhưng với mặt nạ, bạn có thể chụp bất kỳ hình dạng nào. Kiểm tra phần của các đường nét trong blog của tôi để biết thêm chi tiết. Opencvpython.blogspot.com –

Các vấn đề liên quan