图像量化
量化是将图像像素点对应亮度的连续变化区间转换为单个特定值的过程,即将原始灰度图像的坐标空间幅度值离散化。
量化等级越多,图像层次越丰富,灰度分辨率越高,图像质量也越好。
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)
#图像量化等级为2的量化处理
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=0
else:
gray=128
r1[i,j][k]=np.uint8(gray)
#图像量化等级为4的量化处理
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=0
elif img[i,j][k]<128:
gray=64
elif img[i,j][k]<192:
gray=128
else:
gray=192
r2[i,j][k]=np.uint8(gray)
#图像量化等级为8的量化处理
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=0
elif img[i,j][k]<64:
gray=32
elif img[i,j][k]<96:
gray=64
elif img[i,j][k]<128:
gray=96
elif img[i,j][k]<160:
gray=128
elif img[i,j][k]<192:
gray=160
elif img[i,j][k]<224:
gray=192
else:
gray=224
r3[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)
#停止迭代模式选择:
# cv2.TERM_CRITERIA_EPS--精确度(误差)满足epsilon,停止;
# cv2.TERM_CRITERIA_MAX_ITER--迭代次数超过max_iter,停止;
criteria=(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,10,1.0)
#初始中心选择
#cv2.KMEANS_RANDOM_CENTERS--每次随机选择初始中心
#cv2.KMEANS_PP_CENTERS--使用kmeans++算法的中心初始化算法,即初始中心的选择使眼色相差最大
flags=cv2.KMEANS_RANDOM_CENTERS
#k-means聚类
compactness,labels,centers=cv2.kmeans(data,4,None,criteria,10,flags)
#图像转换为uint8二维类型
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]
#采样转换成16*16区域
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*w1
#获取填充颜色 左上角像素点
b=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=True
#鼠标移动且左键单击
elif 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]
#创建窗口,自适应调整窗口大小来显示图像,且不能修改图像
#WINDOW_AUTOSIZE:默认参数
cv2.namedWindow('img')
#回调函数
cv2.setMouseCallback('img',draw)
while(1):
cv2.imshow('img',img)
#按esc退出
if cv2.waitKey(10)&0xFF==27:
break
#按s保存图像
elif 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()