所谓图像量化就是将在空间上连续的图像像素值,转换为区间单个特定值的过程,举个例子,就是把0,1,2,3,4,5 表示为 0-5这样的区间过程。我们通过图像感受一下:
1.图像量化原始图像:
原始图像
绘图等级为2:灰度等级为16:
那么具体怎么实现的呢?方法很简单:
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)
原始图像:
不同灰度等级的图像:
灰度等级=256:
我们可以看到,随着灰度等级变大(灰度等级为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 效果如下:
原始图像:
kmeans 4簇聚类效果:
kmeans 8簇聚类效果:
为了区分两种差异,我们再看一组图像:
,