生活随笔
收集整理的這篇文章主要介紹了
python图像量化及采样处理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
圖像量化
量化是將圖像像素點對應亮度的連續變化區間轉換為單個特定值的過程,即將原始灰度圖像的坐標空間幅度值離散化。
量化等級越多,圖像層次越豐富,灰度分辨率越高,圖像質量也越好。
import cv2
import numpy
as np
import matplotlib
.pyplot
as plt
img
=cv2
.imread
('c.jpg')
r1
=np
.zeros
((img
.shape
[0],img
.shape
[1],3),np
.uint8
)
r2
=np
.zeros
((img
.shape
[0],img
.shape
[1],3),np
.uint8
)
r3
=np
.zeros
((img
.shape
[0],img
.shape
[1],3),np
.uint8
)
for i
in range(img
.shape
[0]):for j
in range(img
.shape
[1]):for k
in range(3):if img
[i
,j
][k
]<128:gray
=0else:gray
=128r1
[i
,j
][k
]=np
.uint8
(gray
)
for i
in range(img
.shape
[0]):for j
in range(img
.shape
[1]):for k
in range(3):if img
[i
,j
][k
]<64:gray
=0elif img
[i
,j
][k
]<128:gray
=64elif img
[i
,j
][k
]<192:gray
=128else:gray
=192r2
[i
,j
][k
]=np
.uint8
(gray
)
for i
in range(img
.shape
[0]):for j
in range(img
.shape
[1]):for k
in range(3):if img
[i
,j
][k
]<32:gray
=0elif img
[i
,j
][k
]<64:gray
=32elif img
[i
,j
][k
]<96:gray
=64elif img
[i
,j
][k
]<128:gray
=96elif img
[i
,j
][k
]<160:gray
=128elif img
[i
,j
][k
]<192:gray
=160elif img
[i
,j
][k
]<224:gray
=192else:gray
=224r3
[i
,j
][k
]=np
.uint8
(gray
)
plt
.rcParams
['font.sans-serif']=['SimHei']
titles
=[u'(a)原始圖像',u'(b)量化-L2',u'(c)量化-L4',u'(d)量化-L8']
images
=[img
,r1
,r2
,r3
]
for i
in range(4):plt
.subplot
(2,2,i
+1)plt
.imshow
(images
[i
])plt
.title
(titles
[i
])plt
.xticks
([])plt
.yticks
([])
plt
.show
()
from cProfile
import label
from sys
import flags
import cv2
import numpy
as np
import matplotlib
.pyplot
as plt
img
=cv2
.imread
('c.jpg')
data
=img
.reshape
((-1,3))
data
=np
.float32
(data
)
criteria
=(cv2
.TERM_CRITERIA_EPS
+cv2
.TERM_CRITERIA_MAX_ITER
,10,1.0)
flags
=cv2
.KMEANS_RANDOM_CENTERS
compactness
,labels
,centers
=cv2
.kmeans
(data
,4,None,criteria
,10,flags
)
centers
=np
.uint8
(centers
)
res
=centers
[labels
.flatten
()]
dst
=res
.reshape
((img
.shape
))
img
=cv2
.cvtColor
(img
,cv2
.COLOR_BGR2RGB
)
dst
=cv2
.cvtColor
(dst
,cv2
.COLOR_BGR2RGB
)
plt
.rcParams
['font.sans-serif']=['SimHei']
titles
=[u'(a)原始圖像',u'(c)量化-L4']
images
=[img
,dst
]
for i
in range(2):plt
.subplot
(1,2,i
+1)plt
.imshow
(images
[i
])plt
.title
(titles
[i
])plt
.xticks
([])plt
.yticks
([])
plt
.show
()
圖像采樣
圖像采樣 處理是將一幅連續圖像在空間上分割成M*N個網格,每個網格用一個亮度值或灰度值來表示。
圖像采樣的間隔越大,所得圖像像素數越少,空間分辨率越低,圖像質量越差,甚至出現馬賽克效應。
import cv2
import numpy
as np
import matplotlib
.pyplot
as plt
img
=cv2
.imread
('c.jpg')
h
=img
.shape
[0]
w
=img
.shape
[1]
h1
=h
//16
w1
=w
//16
img1
=np
.zeros
((h
,w
,3),np
.uint8
)
for i
in range(16):x
=i
*h1
for j
in range(16):y
=j
*w1b
=img
[x
,y
][0]g
=img
[x
,y
][1]r
=img
[x
,y
][2]for n
in range(h1
):for m
in range(w1
):img1
[x
+n
,y
+m
][0]=np
.uint8
(b
)img1
[x
+n
,y
+m
][1]=np
.uint8
(g
)img1
[x
+n
,y
+m
][2]=np
.uint8
(r
)
cv2
.imshow
('img',img
)
cv2
.imshow
('img1',img1
)
cv2
.waitKey
(0)
cv2
.destoryAllWindows
()
局部馬賽克處理
單擊鼠標,給鼠標拖動的區域打上馬賽克,按下ESC退出,按下s鍵可保存圖像至本地。
import cv2
import numpy
as np
import matplotlib
.pyplot
as plt
img
=cv2
.imread
('a.jpg')
en
=False
def draw(event
,x
,y
,flags
,param
):global en
if event
==cv2
.EVENT_LBUTTONDOWN
:en
=Trueelif event
==cv2
.EVENT_MOUSEMOVE
and flags
==cv2
.EVENT_LBUTTONDOWN
:if en
:drawMask
(y
,x
)elif event
==cv2
.EVENT_LBUTTONUP
:en
=False
def drawMask(x
,y
,size
=10):for i
in range(size
):for j
in range(size
):img
[x
+i
][y
+j
]=img
[x
][y
]
cv2
.namedWindow
('img')
cv2
.setMouseCallback
('img',draw
)
while(1):cv2
.imshow
('img',img
)if cv2
.waitKey
(10)&0xFF==27:breakelif cv2
.waitKey
(10)&0xFF==115:cv2
.imwrite
('save.png',img
)
cv2
.destroyAllWindows
()
圖像金字塔
圖像金字塔是指由一組圖像且不同分辨率的子圖集合,它是圖像多尺度表達的一種,以多分辨率來解釋圖像的結構,主要用于圖像的分割或壓縮。
生成金字塔主要包括兩種方式:向下取樣(圖像分辨率不斷降低的過程)、向上取樣(圖像分辨率不斷增大的過程)。
向下取樣
cv2.pyrDown(src,dst,…)
- src:輸入圖像
- dst:輸出圖像,和輸入圖像具有一樣的尺寸和類型
import cv2
img
=cv2
.imread
('a.jpg')
r1
=cv2
.pyrDown
(img
)
r2
=cv2
.pyrDown
(r1
)
r3
=cv2
.pyrDown
(r2
)
cv2
.imshow
('img',img
)
cv2
.imshow
('r1',r1
)
cv2
.imshow
('r2',r2
)
cv2
.imshow
('r3',r3
)
cv2
.waitKey
(0)
cv2
.destroyAllWindows
()
向上取樣
cv2.pyrUp(src,dst,…)
- src:輸入圖像
- dst:輸出圖像,和輸入圖像具有一樣的尺寸和類型
import cv2
img
=cv2
.imread
('a.jpg')
r1
=cv2
.pyrUp
(img
)
cv2
.imshow
('img',img
)
cv2
.imshow
('r1',r1
)
cv2
.waitKey
(0)
cv2
.destroyAllWindows
()
總結
以上是生活随笔為你收集整理的python图像量化及采样处理的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。