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);

代码效果展示:
原始灰值图像

2倍尺寸2值图像模拟灰值图像效果

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);

代码效果展示:
原始灰值图像

4倍尺寸2值图像模拟灰值图像效果

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()
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值