概述
原文出处:
Tairy
系列文章目录
当我们想比较两张图片相似度的时候,可以使用这一节提到的技术
- 直方图对比
- 反向投影
关于这两种技术的原理可以参考我上面贴的链接,下面是示例的代码:
0x01. 绘制直方图
import cv2.cv as cv def drawGraph(ar,im, size): #Draw the histogram on the image minV, maxV, minloc, maxloc = cv.MinMaxLoc(ar) #Get the min and max value hpt = 0.9 * histsize for i in range(size): intensity = ar[i] * hpt / maxV #Calculate the intensity to make enter in the image cv.Line(im, (i,size), (i,int(size-intensity)),cv.Scalar(255,255,255)) #Draw the line i += 1 #---- Gray image orig = cv.LoadImage("img/lena.jpg", cv.CV_8U) histsize = 256 #Because we are working on grayscale pictures which values within 0-255 hist = cv.CreateHist([histsize], cv.CV_HIST_ARRAY, [[0,histsize]], 1) cv.CalcHist([orig], hist) #Calculate histogram for the given grayscale picture histImg = cv.CreateMat(histsize, histsize, cv.CV_8U) #Image that will contain the graph of the repartition of values drawGraph(hist.bins, histImg, histsize) cv.ShowImage("Original Image", orig) cv.ShowImage("Original Histogram", histImg) #--------------------- #---- Equalized image imEq = cv.CloneImage(orig) cv.EqualizeHist(imEq, imEq) #Equlize the original image histEq = cv.CreateHist([histsize], cv.CV_HIST_ARRAY, [[0,histsize]], 1) cv.CalcHist([imEq], histEq) #Calculate histogram for the given grayscale picture eqImg = cv.CreateMat(histsize, histsize, cv.CV_8U) #Image that will contain the graph of the repartition of values drawGraph(histEq.bins, eqImg, histsize) cv.ShowImage("Image Equalized", imEq) cv.ShowImage("Equalized HIstogram", eqImg) #-------------------------------- cv.WaitKey(0)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
import
cv2
.
cv
as
cv
def
drawGraph
(
ar
,
im
,
size
)
:
#Draw the histogram on the image
minV
,
maxV
,
minloc
,
maxloc
=
cv
.
MinMaxLoc
(
ar
)
#Get the min and max value
hpt
=
0.9
*
histsize
for
i
in
range
(
size
)
:
intensity
=
ar
[
i
]
*
hpt
/
maxV
#Calculate the intensity to make enter in the image
cv
.
Line
(
im
,
(
i
,
size
)
,
(
i
,
int
(
size
-
intensity
)
)
,
cv
.
Scalar
(
255
,
255
,
255
)
)
#Draw the line
i
+=
1
#---- Gray image
orig
=
cv
.
LoadImage
(
"img/lena.jpg"
,
cv
.
CV_8U
)
histsize
=
256
#Because we are working on grayscale pictures which values within 0-255
hist
=
cv
.
CreateHist
(
[
histsize
]
,
cv
.
CV_HIST_ARRAY
,
[
[
0
,
histsize
]
]
,
1
)
cv
.
CalcHist
(
[
orig
]
,
hist
)
#Calculate histogram for the given grayscale picture
histImg
=
cv
.
CreateMat
(
histsize
,
histsize
,
cv
.
CV_8U
)
#Image that will contain the graph of the repartition of values
drawGraph
(
hist
.
bins
,
histImg
,
histsize
)
cv
.
ShowImage
(
"Original Image"
,
orig
)
cv
.
ShowImage
(
"Original Histogram"
,
histImg
)
#---------------------
#---- Equalized image
imEq
=
cv
.
CloneImage
(
orig
)
cv
.
EqualizeHist
(
imEq
,
imEq
)
#Equlize the original image
histEq
=
cv
.
CreateHist
(
[
histsize
]
,
cv
.
CV_HIST_ARRAY
,
[
[
0
,
histsize
]
]
,
1
)
cv
.
CalcHist
(
[
imEq
]
,
histEq
)
#Calculate histogram for the given grayscale picture
eqImg
=
cv
.
CreateMat
(
histsize
,
histsize
,
cv
.
CV_8U
)
#Image that will contain the graph of the repartition of values
drawGraph
(
histEq
.
bins
,
eqImg
,
histsize
)
cv
.
ShowImage
(
"Image Equalized"
,
imEq
)
cv
.
ShowImage
(
"Equalized HIstogram"
,
eqImg
)
#--------------------------------
cv
.
WaitKey
(
0
)
|
0x02. 反向投影
import cv2.cv as cv im = cv.LoadImage("img/lena.jpg", cv.CV_8U) cv.SetImageROI(im, (1, 1,30,30)) histsize = 256 #Because we are working on grayscale pictures hist = cv.CreateHist([histsize], cv.CV_HIST_ARRAY, [[0,histsize]], 1) cv.CalcHist([im], hist) cv.NormalizeHist(hist,1) # The factor rescale values by multiplying values by the factor _,max_value,_,_ = cv.GetMinMaxHistValue(hist) if max_value == 0: max_value = 1.0 cv.NormalizeHist(hist,256/max_value) cv.ResetImageROI(im) res = cv.CreateMat(im.height, im.width, cv.CV_8U) cv.CalcBackProject([im], res, hist) cv.Rectangle(im, (1,1), (30,30), (0,0,255), 2, cv.CV_FILLED) cv.ShowImage("Original Image", im) cv.ShowImage("BackProjected", res) cv.WaitKey(0)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import
cv2
.
cv
as
cv
im
=
cv
.
LoadImage
(
"img/lena.jpg"
,
cv
.
CV_8U
)
cv
.
SetImageROI
(
im
,
(
1
,
1
,
30
,
30
)
)
histsize
=
256
#Because we are working on grayscale pictures
hist
=
cv
.
CreateHist
(
[
histsize
]
,
cv
.
CV_HIST_ARRAY
,
[
[
0
,
histsize
]
]
,
1
)
cv
.
CalcHist
(
[
im
]
,
hist
)
cv
.
NormalizeHist
(
hist
,
1
)
# The factor rescale values by multiplying values by the factor
_
,
max_value
,
_
,
_
=
cv
.
GetMinMaxHistValue
(
hist
)
if
max_value
==
0
:
max_value
=
1.0
cv
.
NormalizeHist
(
hist
,
256
/
max_value
)
cv
.
ResetImageROI
(
im
)
res
=
cv
.
CreateMat
(
im
.
height
,
im
.
width
,
cv
.
CV_8U
)
cv
.
CalcBackProject
(
[
im
]
,
res
,
hist
)
cv
.
Rectangle
(
im
,
(
1
,
1
)
,
(
30
,
30
)
,
(
0
,
0
,
255
)
,
2
,
cv
.
CV_FILLED
)
cv
.
ShowImage
(
"Original Image"
,
im
)
cv
.
ShowImage
(
"BackProjected"
,
res
)
cv
.
WaitKey
(
0
)
|
最后
以上就是迷你毛衣为你收集整理的(转载) Python-OpenCV 处理图像(四):图像直方图和反向投影的全部内容,希望文章能够帮你解决(转载) Python-OpenCV 处理图像(四):图像直方图和反向投影所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复