2d гистограмма на OpenCV с использованием одного изображения в градациях серого (одна плоскость)?

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

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

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)

Но второй, когда я звоню в 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)

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

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


person hfingler    schedule 21.06.2011    source источник


Ответы (2)


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

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

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

person Michael Koval    schedule 21.06.2011
comment
Спасибо за разъяснение, так как я не мог сделать 2d, я все равно сделал 1d. - person hfingler; 21.06.2011

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

person Rob    schedule 12.09.2012