2D гистограмма на OpenCV с использованием одного изображения в градациях серого (одна плоскость)? - PullRequest
0 голосов
/ 21 июня 2011

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

Одно измерение в порядке:

from cv import *
import os, glob, sys


original = LoadImage('test.jpg')
gray  = CreateImage(GetSize(original), IPL_DEPTH_8U, 1)
canny = CreateImage(GetSize(original), IPL_DEPTH_8U, 1)
NamedWindow('Circles', 1)


CvtColor(original, gray, CV_BGR2GRAY)

bins = 30
scale = 10
hist = CreateHist([bins], CV_HIST_ARRAY, [[0,256]], 1)
CalcHist([gray], hist)


hist_img = CreateImage([bins*scale,50], 8, 1)
Rectangle(hist_img, (0,0), (bins*scale,50), CV_RGB(255,255,255), -1)


(_, max_value, _, _) = GetMinMaxHistValue(hist)

for i in range(0,bins):
  bin_val = QueryHistValue_1D(hist, i)
  #print bin_val
  norm = Round((bin_val/max_value)*50)
  Rectangle(hist_img, (i*scale, 50), (i*scale+scale-1,50-norm), CV_RGB(0, 0, 0), CV_FILLED)             


ShowImage('Circles', hist_img)
WaitKey(0)

Но 2-й, когда я звоню CalcHist, говорит, что ему нужны две плоскости или изображения:

from cv import *
import os, glob, sys


original = LoadImage('test.jpg')
gray  = CreateImage(GetSize(original), IPL_DEPTH_8U, 1)
NamedWindow('Circles', 1)


CvtColor(original, gray, CV_BGR2GRAY)

bins = 30
scale = 3

hist = CreateHist([bins,bins], CV_HIST_ARRAY, [[0,255], [0,255]], 1)
CalcHist([gray], hist)


hist_img = CreateImage([bins*scale,bins*scale], 8, 1)
#Rectangle(hist_img, (0,0), (bins*scale,50), CV_RGB(255,255,255), -1)
Zero(hist_img)

(_, max_value, _, _) = GetMinMaxHistValue(hist)

for h in range(0,bins):
  for s in range(0,bins):
    bin_val = QueryHistValue_2D(hist, h, s)
    inte = Round(bin_val*255/max_value)
    Rectangle(hist_img, (h*scale, s*scale), ((h+1)*scale-1,(s+1)*scale-1), CV_RGB(inte, inte, inte), CV_FILLED)             


ShowImage('Circles', hist_img)
WaitKey(0)

Эта ошибка:

OpenCV Error: Bad argument (Unknown array type) in cvarrToMat, file /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_graphics_opencv/work/OpenCV-2.2.0/modules/core/src/matrix.cpp, line 641
Traceback (most recent call last):
  File "hist2d.py", line 16, in <module>
    CalcHist([gray], hist, 0)
cv.error: Unknown array type

Если я использую:

CalcHist([gray, gray], hist, 0)

это работает, но я получаю испорченную гистограмму (цветная диагональ, а остальное черное)

Итак ... кто-то может меня просветить?

Ответы [ 3 ]

4 голосов
/ 21 июня 2011

Изображение в градациях серого уже является двумерной гистограммой: интенсивность пикселя ( a , b ) является значением ячейки, определяемой a вдольx-измерение и b вдоль y-измерения.Обычно, когда говорят о гистограммах в компьютерном зрении, говорят о гистограмме по значениям интенсивности .Для изображения в градациях серого - это одномерная гистограмма, где каждый элемент соответствует диапазону значений интенсивности и имеет счетчик, соответствующий количеству пикселей, интенсивность которых падает в этом элементе.

Только гистограммы более высокого размераимеет смысл, если изображение имеет несколько каналов.Например, можно вычислить трехмерную гистограмму значений RGB для цветного изображения.Вызов CalcHist([gray, gray], hist, 0) приводит к диагональной линии, потому что каждый пиксель в первом изображении (gray) имеет то же значение, что и соответствующий пиксель во втором изображении (gray).Это заполняет все ячейки по диагонали в выходной гистограмме.

Также обратите внимание, что многомерная гистограмма очень отличается от трех одномерной гистограммы.

1 голос
/ 24 августа 2012
bins = 10 # specify the number of bins
ranges = (10,255) % specify the top and bottom range of the bins. This truncates the image
hist = cv.CreateHist([bins], cv.CV_HIST_ARRAY, [ranges], 1) # create histograms
cv.CalcHist([gr], hist) # calculate the histograms for the image
(min_value, max_value, min_idx, max_idx) = cv.GetMinMaxHistValue(hist) # get the min and max values for the histogram
0 голосов
/ 13 сентября 2012

Высшее тусклым.гисты не только имеют смысл при RGB-анализе изображений - это только гистограммы интенсивности, но и при извлечении признаков какв GLCM (матрица совпадений уровня серого, 2D), контекст формы (размер зависит от алгоритма) и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...