图像的采样与量化的参数(图像像素差异图像量化和K-Means)

所谓图像量化就是将在空间上连续的图像像素值,转换为区间单个特定值的过程,举个例子,就是把0,1,2,3,4,5 表示为 0-5这样的区间过程。我们通过图像感受一下:

1.图像量化原始图像:

图像的采样与量化的参数(图像像素差异图像量化和K-Means)(1)

原始图像

绘图等级为2:

图像的采样与量化的参数(图像像素差异图像量化和K-Means)(2)

灰度等级为16:

图像的采样与量化的参数(图像像素差异图像量化和K-Means)(3)

那么具体怎么实现的呢?方法很简单:

def quality_sampling(cv2_img, level = 4): """ 采样:灰度分级 """ h,w , channel = cv2_img.shape img_new = np.zeros(cv2_img.shape, np.uint8) ### 空白图像 levels = [int(x*256/level) for x in range(256) if int(x*256/level) < 256] ### 根据灰度等级确定灰度区间数值 ##### 图像灰度分类 for i in range(h): for j in range(w): for c in range(channel): value = cv2_img[i, j][c] current_level = [levels[idx] for idx, next_level in enumerate(levels[1:]) if value >= levels[idx] and next_level > value] if len(current_level)==0: current_level = max(levels) img_new[i,j][c] = np.uint8(current_level) del cv2_img return img_new img_levels = [] img1 = quality_sampling(ori_img, level=2) img2 = quality_sampling(ori_img, level=4) img3 = quality_sampling(ori_img, level=8) img4 = quality_sampling(ori_img, level=12) img5 = quality_sampling(ori_img, level=16) img6 = quality_sampling(ori_img, level=32) img7 = quality_sampling(ori_img, level=64) img8 = quality_sampling(ori_img, level=128) img7 = quality_sampling(ori_img, level=64) img8 = quality_sampling(ori_img, level=128)

原始图像:

图像的采样与量化的参数(图像像素差异图像量化和K-Means)(4)

不同灰度等级的图像:

图像的采样与量化的参数(图像像素差异图像量化和K-Means)(5)

灰度等级=256:

图像的采样与量化的参数(图像像素差异图像量化和K-Means)(6)

我们可以看到,随着灰度等级变大(灰度等级为2,表示将256的像素值分为2份,即0~128位一份,),图像越来越接近原始图像,其实就是把灰度值接近的放到一起,这也类似k-means。 只不过后者是根据灰度值进行分组(分组间距可能是不等距的),分组是根据各像素值之间的接近程度划分的,而前者是强制的等间距分组。

2. kmeans

实现方法:

def kmeans(cv2_img, num_cluster=4): data = ori_img.reshape((-1, 3)) data = np.float32(data) h,w,channel = cv2_img.shape #### 中点 criteria = (cv2.TERM_CRITERIA_EPS cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) # 设置标签 flags = cv2.KMEANS_RANDOM_CENTERS compactness, labels, centers = cv2.kmeans(data, K=num_cluster, bestLabels=None, criteria=criteria, attempts=10, flags=flags) centers = np.uint8(centers) ### 数据类型转换 img_kmeans = centers[labels.flatten()] ## 转换 img_kmeans = img_kmeans.reshape((cv2_img.shape)) del cv2_img return img_kmeans

kmeans 效果如下:

原始图像:

图像的采样与量化的参数(图像像素差异图像量化和K-Means)(7)

kmeans 4簇聚类效果:

图像的采样与量化的参数(图像像素差异图像量化和K-Means)(8)

kmeans 8簇聚类效果:

图像的采样与量化的参数(图像像素差异图像量化和K-Means)(9)

图像的采样与量化的参数(图像像素差异图像量化和K-Means)(10)

为了区分两种差异,我们再看一组图像:

图像的采样与量化的参数(图像像素差异图像量化和K-Means)(11)

图像的采样与量化的参数(图像像素差异图像量化和K-Means)(12)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页