python图像量化及采样处理

图像量化

量化是将图像像素点对应亮度的连续变化区间转换为单个特定值的过程,即将原始灰度图像的坐标空间幅度值离散化。
量化等级越多,图像层次越丰富,灰度分辨率越高,图像质量也越好。

import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('c.jpg')
r1=np.zeros((img.shape[0],img.shape[1],3),np.uint8)
r2=np.zeros((img.shape[0],img.shape[1],3),np.uint8)
r3=np.zeros((img.shape[0],img.shape[1],3),np.uint8)
#图像量化等级为2的量化处理
for i in range(img.shape[0]):
  for j in range(img.shape[1]):
    for k in range(3):
      if img[i,j][k]<128:
        gray=0
      else:
        gray=128
      r1[i,j][k]=np.uint8(gray)
#图像量化等级为4的量化处理
for i in range(img.shape[0]):
  for j in range(img.shape[1]):
    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
      r2[i,j][k]=np.uint8(gray)
#图像量化等级为8的量化处理
for i in range(img.shape[0]):
  for j in range(img.shape[1]):
    for k in range(3):
      if img[i,j][k]<32:
        gray=0
      elif img[i,j][k]<64:
        gray=32
      elif img[i,j][k]<96:
        gray=64
      elif img[i,j][k]<128:
        gray=96
      elif img[i,j][k]<160:
        gray=128
      elif img[i,j][k]<192:
        gray=160
      elif img[i,j][k]<224:
        gray=192
      else:
        gray=224
      r3[i,j][k]=np.uint8(gray)
plt.rcParams['font.sans-serif']=['SimHei']
titles=[u'(a)原始图像',u'(b)量化-L2',u'(c)量化-L4',u'(d)量化-L8']
images=[img,r1,r2,r3]
for i in range(4):
  plt.subplot(2,2,i+1)
  plt.imshow(images[i])
  plt.title(titles[i])
  #不显示横纵坐标
  plt.xticks([])
  plt.yticks([])
plt.show()

在这里插入图片描述

from cProfile import label
from sys import flags
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('c.jpg')
#将二维图像转换为一维图像
data=img.reshape((-1,3))
data=np.float32(data)
#停止迭代模式选择:
# cv2.TERM_CRITERIA_EPS--精确度(误差)满足epsilon,停止;
# cv2.TERM_CRITERIA_MAX_ITER--迭代次数超过max_iter,停止;
criteria=(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,10,1.0)
#初始中心选择
#cv2.KMEANS_RANDOM_CENTERS--每次随机选择初始中心
#cv2.KMEANS_PP_CENTERS--使用kmeans++算法的中心初始化算法,即初始中心的选择使眼色相差最大
flags=cv2.KMEANS_RANDOM_CENTERS
#k-means聚类
compactness,labels,centers=cv2.kmeans(data,4,None,criteria,10,flags)
#图像转换为uint8二维类型
centers=np.uint8(centers)
res=centers[labels.flatten()]
dst=res.reshape((img.shape))
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
dst=cv2.cvtColor(dst,cv2.COLOR_BGR2RGB)
plt.rcParams['font.sans-serif']=['SimHei']
titles=[u'(a)原始图像',u'(c)量化-L4']
images=[img,dst]
for i in range(2):
  plt.subplot(1,2,i+1)
  plt.imshow(images[i])
  plt.title(titles[i])
  plt.xticks([])
  plt.yticks([])
plt.show()

在这里插入图片描述

图像采样

图像采样 处理是将一幅连续图像在空间上分割成M*N个网格,每个网格用一个亮度值或灰度值来表示。
图像采样的间隔越大,所得图像像素数越少,空间分辨率越低,图像质量越差,甚至出现马赛克效应。

import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('c.jpg')
h=img.shape[0]
w=img.shape[1]
#采样转换成16*16区域
h1=h//16
w1=w//16
img1=np.zeros((h,w,3),np.uint8)
for i in range(16):
  x=i*h1
  for j in range(16):
    y=j*w1
    #获取填充颜色 左上角像素点
    b=img[x,y][0]
    g=img[x,y][1]
    r=img[x,y][2]
    for n in range(h1):
      for m in range(w1):
        img1[x+n,y+m][0]=np.uint8(b)
        img1[x+n,y+m][1]=np.uint8(g)
        img1[x+n,y+m][2]=np.uint8(r)
cv2.imshow('img',img)
cv2.imshow('img1',img1)
cv2.waitKey(0)
cv2.destoryAllWindows()

在这里插入图片描述

局部马赛克处理

单击鼠标,给鼠标拖动的区域打上马赛克,按下ESC退出,按下s键可保存图像至本地。

import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('a.jpg')
en=False
#鼠标移动事件
def draw(event,x,y,flags,param):
  global en
  #鼠标左键单击
  if event==cv2.EVENT_LBUTTONDOWN:
    en=True
  #鼠标移动且左键单击
  elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_LBUTTONDOWN:
    if en:
      #调用函数打马赛克
      drawMask(y,x)
    #鼠标左键释放
    elif event==cv2.EVENT_LBUTTONUP:
      en=False
#图像局部采样
def drawMask(x,y,size=10):
  for i in range(size):
    for j in range(size):
      img[x+i][y+j]=img[x][y]
#创建窗口,自适应调整窗口大小来显示图像,且不能修改图像
#WINDOW_AUTOSIZE:默认参数
cv2.namedWindow('img')
#回调函数
cv2.setMouseCallback('img',draw)
while(1):
  cv2.imshow('img',img)
  #按esc退出
  if cv2.waitKey(10)&0xFF==27:
    break
  #按s保存图像
  elif cv2.waitKey(10)&0xFF==115:
    cv2.imwrite('save.png',img)
cv2.destroyAllWindows()

在这里插入图片描述

图像金字塔

图像金字塔是指由一组图像且不同分辨率的子图集合,它是图像多尺度表达的一种,以多分辨率来解释图像的结构,主要用于图像的分割或压缩。
生成金字塔主要包括两种方式:向下取样(图像分辨率不断降低的过程)、向上取样(图像分辨率不断增大的过程)。

向下取样

cv2.pyrDown(src,dst,…)

  • src:输入图像
  • dst:输出图像,和输入图像具有一样的尺寸和类型
import cv2
img=cv2.imread('a.jpg')
r1=cv2.pyrDown(img)
r2=cv2.pyrDown(r1)
r3=cv2.pyrDown(r2)
cv2.imshow('img',img)
cv2.imshow('r1',r1)
cv2.imshow('r2',r2)
cv2.imshow('r3',r3)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

向上取样

cv2.pyrUp(src,dst,…)

  • src:输入图像
  • dst:输出图像,和输入图像具有一样的尺寸和类型
import cv2
img=cv2.imread('a.jpg')
r1=cv2.pyrUp(img)
cv2.imshow('img',img)
cv2.imshow('r1',r1)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

  • 1
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值