Matlab实现二值图像模拟灰度图像显示效果
抖动技术
对于可用颜色较少的系统,可以以牺牲分辨率为代价,通过颜色值的抖动来增加可用颜色数量。以黑白激光打印机为例,可以通过控制黑点分布的稀疏程度,来使打印出的二值图像能够表示不同灰度级。
基本原理: 当⼈眼从较远距离观察图像时,将会平均局部小区域像素的灰度值,并记录之;
图案法
讲抖动算法,一般都会提到到图案法。图案法(patterning)是指灰度可以用一定比例的黑白点组成的区域表示,从而达到整体图像的灰度感
抖动矩阵
2x2抖动矩阵
如下图所示,2x2的图案可以表示5级灰度:
4x4抖动矩阵
4x4的图案可以表示17级灰度
Matlab代码实现
2x2抖动矩阵实现2倍尺寸的模拟灰度图像的显示效果
clc;
clear;
close all;
A=imread('d:\Temp\lena.jpg'); %图像路径
A=rgb2gray(A);
figure(),imshow(A)
Row=size(A,1);
Col=size(A,2);
D=[0 2;3,1]; %2x2抖动矩阵
O=zeros(2*Row,2*Col); %输出矩阵
div=256/4; %将灰度图像的灰度级限制在4以内
tmp=A./(div); %零时矩阵
for i=1:Row
for j=1:Col
for p=1:2
for q=1:2
if round(tmp(i,j))>D(p,q)
O(2*(i-1)+p,2*(j-1)+q)=1;
else
O(2*(i-1)+p,2*(j-1)+q)=0;
end
end
end
end
end
figure,imshow(O);
代码效果展示:
4x4抖动矩阵实现4倍尺寸的模拟灰度图像的显示效果
clc;
clear;
close all;
A=imread('d:\Temp\lena.jpg'); %图片路径
A=rgb2gray(A); %转换为灰值图像
figure(),imshow(A)
Row=size(A,1);
Col=size(A,2);
D=[0,8,2,10;12,4,14,6;3,11,1,9;15,7,13,5]; %4x4抖动矩阵
O=zeros(4*Row,4*Col); %输出矩阵
div=256/16; %将灰值图像的灰度级限制在16以内
tmp=A./(div); %临时矩阵
for i=1:Row
for j=1:Col
for p=1:4
for q=1:4
if tmp(i,j)>D(p,q)
O(4*(i-1)+p,4*(j-1)+q)=1;
else
O(4*(i-1)+p,4*(j-1)+q)=0;
end
end
end
end
end
figure,imshow(O);
代码效果展示:
python实现(补充)
4x4矩阵抖动矩阵
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
im=np.array(Image.open('d:\Temp\lena.jpg').convert('L'))
plt.gray()
plt.subplot(121)
plt.imshow(im)
m,n=im.shape
div=256/16
im=im/div
D=[[0,8,2,10],[12,4,14,6],[3,11,1,9],[15,7,13,5]]
O=np.zeros((4*m,4*n))
for i in range(m):
for j in range(n):
for p in range(4):
for q in range(4):
if im[i][j]>D[p][q]:
O[4*(i-1)+p][4*(j-1)+q]=1
else:
O[4*(i-1)+p][4*(j-1)+q]=0
plt.subplot(122)
plt.imshow(O)
plt.show()