所谓图像量化就是将在空间上连续的图像像素值,转换为区间单个特定值的过程,举个例子,就是把0,1,2,3,4,5表示为05这样的区间过程。我们通过图像感受一下: 1。图像量化原始图像: 原始图像绘图等级为2: 灰度等级为16: 那么具体怎么实现的呢?方法很简单:defqualitysampling(cv2img,level4):采样:灰度分级h,w,channelcv2img。shapeimgnewnp。zeros(cv2img。shape,np。uint8)空白图像levels〔int(x256level)forxinrange(256)ifint(x256level)256〕根据灰度等级确定灰度区间数值图像灰度分类foriinrange(h):forjinrange(w):forcinrange(channel):valuecv2img〔i,j〕〔c〕currentlevel〔levels〔idx〕foridx,nextlevelinenumerate(levels〔1:〕)ifvaluelevels〔idx〕andnextlevelvalue〕iflen(currentlevel)0:currentlevelmax(levels)imgnew〔i,j〕〔c〕np。uint8(currentlevel)delcv2imgreturnimgnewimglevels〔〕img1qualitysampling(oriimg,level2)img2qualitysampling(oriimg,level4)img3qualitysampling(oriimg,level8)img4qualitysampling(oriimg,level12)img5qualitysampling(oriimg,level16)img6qualitysampling(oriimg,level32)img7qualitysampling(oriimg,level64)img8qualitysampling(oriimg,level128)img7qualitysampling(oriimg,level64)img8qualitysampling(oriimg,level128) 原始图像: 不同灰度等级的图像: 灰度等级256: 我们可以看到,随着灰度等级变大(灰度等级为2,表示将256的像素值分为2份,即0128位一份,),图像越来越接近原始图像,其实就是把灰度值接近的放到一起,这也类似kmeans。只不过后者是根据灰度值进行分组(分组间距可能是不等距的),分组是根据各像素值之间的接近程度划分的,而前者是强制的等间距分组。 2。kmeans 实现方法:defkmeans(cv2img,numcluster4):dataoriimg。reshape((1,3))datanp。float32(data)h,w,channelcv2img。shape中点criteria(cv2。TERMCRITERIAEPScv2。TERMCRITERIAMAXITER,10,1。0)设置标签flagscv2。KMEANSRANDOMCENTERScompactness,labels,centerscv2。kmeans(data,Knumcluster,bestLabelsNone,criteriacriteria,attempts10,flagsflags)centersnp。uint8(centers)数据类型转换imgkmeanscenters〔labels。flatten()〕转换imgkmeansimgkmeans。reshape((cv2img。shape))delcv2imgreturnimgkmeans kmeans效果如下:原始图像: kmeans4簇聚类效果: kmeans8簇聚类效果: 为了区分两种差异,我们再看一组图像: