图像处理入门五

图像处理入门五

1.图像量化处理

(1)图像量化处理原理
量化(Quantization)旨在将图像像素点对应亮度的连续变化区间转换为单个特定值的过程,即将原始灰度图像的空间坐标幅度值离散化。(量化等级越多,图像层次越丰富,所代表的灰度颜色就越多)
如果量化等级为 2,则将使用两种灰度级表示原始图片的像素(0~255),灰度值小于 128 的取 0,大于等于 128 的取 128;如果量化等级为 4,则将使用四种灰度级表示原始图片的像素,新图像将分层为四种颜色,0-64区间取0,64-128 区间取 64,128-192 区间取 128,192-255 区间取 192,依次类推。
图像处理入门五_第1张图片
对比不同量化等级的“Lena”图,量化等级a:256,b:64,c:16,d:8,e:4,f:2
图像处理入门五_第2张图片

(2)图像量化实现
图像量化的实现过程是建立一张临时图片,接着循环遍历原始图像中所有像素点,判断每个像素点应该属于的量化等级,最后将临时图像显示。

import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取源图像
img=cv2.imread('lena-hd.png')
#获取图像的高度和宽度
height=img.shape[0]
weight=img.shape[1]

#创建一副图像
new_img1 = np.zeros((height, width, 3), np.uint8)
new_img2 = np.zeros((height, width, 3), np.uint8)
new_img3 = np.zeros((height, width, 3), np.uint8)
#图像量化操作 量化等级为2
for i in range(height):
	for j in range(weight):
		for k in range(3):#对应BGR三分量
			if img[i,j][k]<128:
				gray=0
			else:
				gray=128
			new_img1[i,j][k]=np.uint8(gray)
#量化等级为4的量化处理
for i in range(height):
	for j in range(weight):
		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
		new_img2[i,j][k]=np.uint8(gray)
#量化等级为8的量化处理
#此处省略

#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
#显示图像
titles = ['(a) 原始图像', '(b) 量化-L2', '(c) 量化-L4', '(d) 量化-L8']
images = [img, new_img1, new_img2, new_img3] 
for i in range(4): 
	plt.subplot(2,2,i+1), plt.imshow(images[i], 'gray'), 
	plt.title(titles[i]) 
	plt.xticks([]),plt.yticks([]) 
plt.show()

图像处理入门五_第3张图片
(3)K-Means聚类实现量化处理
根据像素之间的相似性进行聚类处理,将彩色图像RGB像素点进行颜色分割和颜色量化。
cv2.kmeans(data, 8, None, criteria, 10, flags)

import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img=cv2.imread('luo.png')
#图像二维像素转换为一维
data=img.reshape((-1,3))
data=np.float32(data)

#定义中心(type,max_iter,epsilon)
criteria=(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,10,1.0)
#设置标签
flags=cv2.KMEANS_RANDOM_CENTERS
#K-Means聚类 聚集成4类
compactness,labels,centers=cv2.kmeans(data,8,None,criteria,10,flags)

#图像转换回uint8二维类型
centers=np.unit8(centers)
res=centers[labels.flatten()]
dst=res.reshape((img.shape))
#图像转换为RGB显示
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
dst=cv2.cvtColor(dst,cv2.COLOR_BGR2RGB)
#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']

#显示图像
titles = ['原始图像', '聚类量化 K=8'] 
images = [img, dst] 
for i in range(2): 
	plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray'), plt.title(titles[i]) 
	plt.xticks([]),plt.yticks([]) 
plt.show()

图像处理入门五_第4张图片

2.图像采样处理

(1)图像采样处理原理
图像采样(Image Sampling)处理是将一幅连续图像在空间上分割成M×N 个网格,每个网格用一个亮度值或灰度值来表示。图像采样的间隔越大,所得图像像素数越少,空间分辨率越低,图像质量越差,甚至出现马赛克效应;相反,图像采样的间隔越小,所得图像像素数越多,空间分辨率越高,图像质量越好,但数据量会相应的增大。
图像处理入门五_第5张图片
a:原始图像,b:128X128, c:64X64 ,d:32X32, e:16X16, f:8X8
图像处理入门五_第6张图片
(2)图像采样实现

import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图片
img=cv2.imread('lena-hd.png')
#获取图像高度和宽度
height=img.shape[0]
width=img.shape[1]
#采样转换成16*16区域
numHeight=int(height/16)
numWidth=int(width/16)
#创建一副图像
new_img=np.zeros((height,width,3),np.uint8)
#图像循环采样16*16区域
for i in range(16):
	#获取Y坐标
	y=i*numHeight
	for j in range(16):
		x=j*numWidth
		#获取填充颜色,左上角像素点
		b=img[y,x][0]
		g=img[y,x][1]
		r=img[y,x][2]
		#循环设置小区域采样
		for n in range(numHeight):
			for m in range(numWidth):
				new_img[y+n,x+m][0]=np.uint8(b)
				new_img[y+n,x+m][1]=np.uint8(g)
				new_img[y+n,x+m][2]=np.uint8(r)
#显示图像
cv2.imshow('src',img)
cv2.imshow('sampling',new_img)
#等待显示
cv2.waitKey(0)
cv2.destoryAllWindows()
	

图像处理入门五_第7张图片
(3)图像局部采样处理
图像局部采样处理:当鼠标按下时,它能够给鼠标拖动的区域打上马赛克,并按下“s”键保存图像至本地

import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
im=cv2.imread('luo.png',1)
#设置鼠标左键开启
en=False
#鼠标事件
def draw(event,x,y,flags,param):
	global en
	#鼠标左键按下开启en值
	if event==cv2.EVENT_LBUTTONDOWN:
		en=True
	#鼠标左键按下并且移动
	elif event==cv.EVENT_MOUSEMOVE and flags==cv.EVENT_LBUTTONDOWN:
		#调用函数打马赛克
		if en:
			drawMask(y,x)
		#鼠标左键弹起结束操作
		elif event==cv2.EVENT_LBUTTONUP:
			en=False
#图像局部采样操作
def drawMask(x,y,size=10):
	#size*size 采样处理
	m=int(x/size*size)
	n=int(y/size*size)
	print(m,n)
	#10*10区域设置为同一像素值
	for i in range(size):
		for j in range(size):
			im[m+i][n+j]=im[m][n]
#打开对话框
cv2.namedWindow('image')
#调用draw函数设置鼠标操作
cv2.setMouseCallback('image',draw)
#循环处理
while(1):
	cv2.imshow('image',im)
	#按ESC键退出
	if cv2.waitKey(10)&0xFF==27:
		break
	#按s键保存图片
	elif cv2.waitKey(10)&0xFF==115:
		cv2.imwrite('szve.png',im)
#退出窗口
cv2.destoryAllWindows()		

图像处理入门五_第8张图片

你可能感兴趣的:(图像处理,图像处理,计算机视觉,opencv)