Python中图像量化处理的示例分析(python,开发技术)

时间:2024-04-29 12:02:34 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

一.图像量化处理原理

量化(Quantization)旨在将图像像素点对应亮度的连续变化区间转换为单个特定值的过程,即将原始灰度图像的空间坐标幅度值离散化。量化等级越多,图像层次越丰富,灰度分辨率越高,图像的质量也越好;量化等级越少,图像层次欠丰富,灰度分辨率越低,会出现图像轮廓分层的现象,降低了图像的质量。图8-1是将图像的连续灰度值转换为0至255的灰度级的过程[1-3]。

Python中图像量化处理的示例分析

如果量化等级为2,则将使用两种灰度级表示原始图片的像素(0-255),灰度值小于128的取0,大于等于128的取128;如果量化等级为4,则将使用四种灰度级表示原始图片的像素,新图像将分层为四种颜色,0-64区间取0,64-128区间取64,128-192区间取128,192-255区间取192,依次类推。

图8-2是对比不同量化等级的“Lena”图。其中(a)的量化等级为256,(b)的量化等级为64,(c)的量化等级为16,(d)的量化等级为8,(e)的量化等级为4,(f)的量化等级为2。

Python中图像量化处理的示例分析

二.图像量化实现

图像量化的实现过程是建立一张临时图片,接着循环遍历原始图像中所有像素点,判断每个像素点应该属于的量化等级,最后将临时图像显示。下面的代码将灰度图像转换为两种量化等级[4]。

#-*-coding:utf-8-*-#By:Eastmountimportcv2importnumpyasnpimportmatplotlib.pyplotasplt#读取原始图像img=cv2.imread('lena-hd.png')#获取图像高度和宽度height=img.shape[0]width=img.shape[1]#创建一幅图像new_img=np.zeros((height,width,3),np.uint8)#图像量化操作量化等级为2foriinrange(height):forjinrange(width):forkinrange(3):#对应BGR三分量ifimg[i,j][k]<128:gray=0else:gray=128new_img[i,j][k]=np.uint8(gray)#显示图像cv2.imshow("src",img)cv2.imshow("",new_img)#等待显示cv2.waitKey(0)cv2.destroyAllWindows()

其输出结果如图8-3所示,它将灰度图像划分为两种量化等级。

Python中图像量化处理的示例分析

三.图像量化等级对比

下面的代码分别比较了量化等级为2、4、8的量化处理效果[5]。

#-*-coding:utf-8-*-#By:Eastmountimportcv2importnumpyasnpimportmatplotlib.pyplotasplt#读取原始图像img=cv2.imread('lena-hd.png')#获取图像高度和宽度height=img.shape[0]width=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的量化处理foriinrange(height):forjinrange(width):forkinrange(3):#对应BGR三分量ifimg[i,j][k]<128:gray=0else:gray=128new_img1[i,j][k]=np.uint8(gray)#图像量化等级为4的量化处理foriinrange(height):forjinrange(width):forkinrange(3):#对应BGR三分量ifimg[i,j][k]<64:gray=0elifimg[i,j][k]<128:gray=64elifimg[i,j][k]<192:gray=128else:gray=192new_img2[i,j][k]=np.uint8(gray)#图像量化等级为8的量化处理foriinrange(height):forjinrange(width):forkinrange(3):#对应BGR三分量ifimg[i,j][k]<32:gray=0elifimg[i,j][k]<64:gray=32elifimg[i,j][k]<96:gray=64elifimg[i,j][k]<128:gray=96elifimg[i,j][k]<160:gray=128elifimg[i,j][k]<192:gray=160elifimg[i,j][k]<224:gray=192else:gray=224new_img3[i,j][k]=np.uint8(gray)#用来正常显示中文标签plt.rcParams['font.sans-serif']=['SimHei']#显示图像titles=['(a)原始图像','(b)量化-L2','(c)量化-L4','(d)量化-L8']images=[img,new_img1,new_img2,new_img3]foriinrange(4):plt.subplot(2,2,i+1),plt.imshow(images[i],'gray'),plt.title(titles[i])plt.xticks([]),plt.yticks([])plt.show()

输出结果如图8-4所示,该代码调用matplotlib.pyplot库绘制了四幅图像,其中(a)表示原始图像,(b)表示等级为2的量化处理,(c)表示等级为4的量化处理,(d)表示等级为8的量化处理。

Python中图像量化处理的示例分析

四.K-Means聚类实现量化处理

除了通过对像素进行统计比较量化处理,还可以根据像素之间的相似性进行聚类处理。这里补充一个基于K-Means聚类算法的量化处理过程,它能够将彩色图像RGB像素点进行颜色分割和颜色量化。此外,该部分只是带领读者简单认识该方法,更多K-Means聚类的知识将在图像分割文章中进行详细叙述[6]。

#coding:utf-8#By:Eastmountimportcv2importnumpyasnpimportmatplotlib.pyplotasplt#读取原始图像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.uint8(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]foriinrange(2):plt.subplot(1,2,i+1),plt.imshow(images[i],'gray'),plt.title(titles[i])plt.xticks([]),plt.yticks([])plt.show()

输出结果如图8-5所示。

Python中图像量化处理的示例分析

它通过K-Means聚类算法将彩色人物图像的灰度聚集成八种颜色。核心代码如下:

cv2.kmeans(data, 8, None, criteria, 10, flags)

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:Python中图像量化处理的示例分析的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:vue的keep-alive怎么正确使用下一篇:

6 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18