数字加网(二)— —调幅加网算法及实现

在上一篇中提到调幅加网的方法有有理正切、无理正切和超细胞方法。无理正切方法,与有理正切本质相同,但是因为正切值为无理数,不能保证网格的角点与输出设备记录栅格的角点重合,需要进行一个强制重合的过程,一般数字加网方法里对其讨论较少。而超细胞的方法相当于外面一个大的阈值矩阵是有理正切,里面若干小的阈值矩阵是无理正切的。下图分别是有理正切和超细胞方法。

上段提到阈值矩阵,如下图,其实也可以叫做蒙板或者窗口,即在待加网的图像上“走”一圈下来(扫描整幅图像),当前像素值比阈值矩阵中相对应的值大,则像素值置为1,反之置为0。阈值矩阵本质就是一个矩阵,通过矩阵的值控制加网的网点形状(圆形、方形、菱形等)。当然不同的加网角度也对应不同的阈值矩阵。

阈值矩阵的设计

接下来我将给出调幅加网的算法及Python代码,主要参考徐锦林的《调幅加网阈值矩阵设计方法与加网原理》,文中基于最小阈值矩阵原理,详述12×12网格的最小阈值矩阵的设计原则。网格构成为12×12时,加网角度0度,45度,15度(14.04)和75度(75.96),对应的网格大小分别为为144、128与153,加网阈值的个数远小于255。加网时需将灰度图像的像素值与加网阈值比较,因此必须建立两者的转换(映射)关系。可采用以下公式处理。

式中fix表示取最小整数(下同),Qmax为对应的网格的最大值(144,218,513)。

加网角度为0度的阈值矩阵

加网角度为45度的阈值矩阵

加网角度为14.04度的阈值矩阵

加网角度为75.96度的阈值矩阵

后两个阈值矩阵分别为网线角度14.04°和75.96°时的最小阈值矩阵,因列数太多,故将表格拆开成左右两部分。不难发现,如将这两个矩阵扩展为51×51的方阵,则它们互为转置矩阵。

加网过程及算法

采用最小阈值矩阵进行灰度图像加网的过程如图所示。设原灰度图像大小(像素数)为(W ×H ),在网格构成为12×12时,则加网的二值图像大小(像素数)必为N (12×W )×M (12×H )。加网时从上到下,从左到右扫描加网图像的每一个像素,由其坐标值如图中的(m ,n ),求出该像素在阈值矩阵中对应的阈值坐标(k ,l ),得到加网阈值Q (k ,l ),同时从原灰度图像中查到与之对应的像素坐标(i ,j ),得到原灰度图像的像素值F (i ,j ),然后将灰度图像的像素值F (i ,j )与阈值Q (k ,l )比较,即可决定加网图像中该像素的取值,即决定P (m ,n )是“1”还是“0”,从而完成一个像素的加网过程。为了清楚地表示加网过程,图中的箭头处加了序号。

0度加网算法

### Digital Screening
### Author: Sin_Geek
### Date: 2015-05-17

from PIL import Image

time = 12
K = 12
L = 12
N = 144
im = Image.open(‘lena0.jpg‘).convert(‘L‘)
im2 = Image.new("1",(im.size[0]*time,im.size[1]*time))

Mask=[144,140,132,122,107,63,54,93,106,123,133,142,
    143,137,128,104,94,41,31,65,98,116,120,139,
    135,131,114,97,61,35,24,55,80,103,113,125,
    126,117,88,83,56,29,15,51,68,90,99,111,
    109,100,81,77,48,22,8,28,47,76,85,96,
    91,44,16,12,9,3,5,21,25,33,37,73,
        59,58,30,18,10,1,2,4,11,19,34,42,
    92,64,57,52,26,6,7,14,32,46,53,74,
    101,95,70,67,38,13,20,36,50,75,82,108,
    121,110,86,78,45,17,27,39,69,79,102,119,
    134,129,112,89,49,23,43,60,71,87,115,127,
    141,138,124,118,66,40,62,72,84,105,130,136]

for m in range(im2.size[1]):
    k = m % K
    for n in range(im2.size[0]):
        l = n % L
        pix = int(im.getpixel((m/time,n/time))/255.0*N+0.5)
        if pix > Mask[k*L+l]:
            im2.putpixel((m,n),1)
        else:
            im2.putpixel((m,n),0)
im2.save("AM0.bmp")

效果图

15度加网算法

### Digital Screening
### Author: Sin_Geek
### Date: 2015-05-17

from PIL import Image

time = 12
K = 3
L = 51
N = 153
q = 4
im = Image.open(‘lena0.jpg‘).convert(‘L‘)
im2 = Image.new("1",(im.size[0]*time,im.size[1]*time))

Mask=[  153,148,120,77,53,28,26,60,87,122,131,135,132,124,116,104,73,47,23,6,56,66,85,57,51,39,
    19,8,15,2,7,17,55,79,83,99,102,109,112,117,105,74,54,14,24,64,84,121,137,142,150,
    145,139,101,69,48,11,34,68,100,128,138,143,147,141,125,97,71,43,13,30,62,90,107,110,96,91,
    76,52,27,20,5,4,21,25,37,45,82,92,94,95,98,63,41,1,38,67,89,127,134,140,149,
    136,126,88,59,31,12,46,75,114,130,146,151,152,144,136,86,61,40,18,49,70,103,119,123,115,111,
    108,93,80,65,36,3,22,50,35,9,16,32,44,81,78,58,29,10,42,72,106,113,118,129,133]

for m in range(im2.size[1]):
    k = m % K
    t = L-(q*K*(m/K))%L
    for n in range(im2.size[0]):
        l = (n%L+t)%L
        pix = int(im.getpixel((m/time,n/time))/255.0*N+0.5)
        if pix > Mask[k*L+l]:
            im2.putpixel((m,n),1)
        else:
            im2.putpixel((m,n),0)
im2.save("AM15.bmp")

效果图

45度加网算法

### Digital Screening
### Author: Sin_Geek
### Date: 2015-05-17

from PIL import Image

time = 12
K = 8
L = 16
N = 128
im = Image.open(‘lena0.jpg‘).convert(‘L‘)
im2 = Image.new("1",(im.size[0]*time,im.size[1]*time))

Mask=[128,120,109,92,74,66,46,8,15,10,64,79,97,111,122,127,
        123,116,87,69,62,38,6,39,42,3,19,55,86,105,115,119,
        107,96,71,59,24,12,28,52,63,47,20,1,58,95,108,112,
        84,73,56,2,18,23,48,78,82,67,35,5,31,61,91,101,
        77,53,32,4,25,43,75,85,100,89,60,30,9,34,68,80,
        51,41,21,27,40,70,94,102,110,103,93,57,26,11,37,65,
        44,29,33,45,72,90,104,121,117,114,106,88,54,17,13,16,
        14,36,49,76,83,98,118,126,125,124,113,99,81,50,22,7]

for m in range(im2.size[1]):
    k = m % K
    if m/K%2 == 0:
        t = 0
    else:
        t = K
    for n in range(im2.size[0]):
        l = (n%L+t)%L
        pix = int(im.getpixel((m/time,n/time))/255.0*N+0.5)
        if pix > Mask[k*L+l]:
            im2.putpixel((m,n),1)
        else:
            im2.putpixel((m,n),0)
im2.save("AM45.bmp")

效果图

75度加网算法

### Digital Screening
### Author: Sin_Geek
### Date: 2015-05-17

from PIL import Image

time = 12
K = 3
L = 51
N = 153
q = 4
im = Image.open(‘lena0.jpg‘).convert(‘L‘)
im2 = Image.new("1",(im.size[0]*time,im.size[1]*time))

Mask=[153,145,136,117,95,81,8,52,93,104,97,86,77,69,59,54,41,29,7,5,36,23,13,18,26,34,
        46,64,67,72,79,25,50,66,90,103,122,128,130,137,134,118,102,82,16,51,96,115,132,147,152,
        148,139,126,105,98,78,15,27,80,73,71,61,53,48,31,14,1,10,17,4,3,6,30,49,60,68,
        75,84,89,106,83,37,35,85,107,119,131,138,146,142,140,129,109,92,32,39,91,111,124,141,144,
        120,101,88,74,63,58,2,20,65,47,43,40,28,11,12,24,38,42,55,21,22,56,62,70,87,100,
        114,121,127,113,99,45,9,57,110,123,135,143,151,150,149,133,112,94,44,19,76,108,116,125,136]

for m in range(im2.size[1]):
    k = m % K
    t = q*K*(m/K)%L;
    for n in range(im2.size[0]):
        l = (n%L+t)%L
        pix = int(im.getpixel((m/time,n/time))/255.0*N+0.5)
        if pix > Mask[k*L+l]:
            im2.putpixel((m,n),1)
        else:
            im2.putpixel((m,n),0)
im2.save("AM75.bmp")

效果图

时间: 2024-11-03 03:39:13

数字加网(二)— —调幅加网算法及实现的相关文章

解决ArcGIS API for Silverlight 加载地图的内外网访问问题

原文:解决ArcGIS API for Silverlight 加载地图的内外网访问问题 先上一个类,如下: public class BaseClass { public static string getFullUri(string oldUriString) { string newUriString = oldUriString; //处理相对地址============================================================ if (newUri

医院内外网之间通过网闸交互,通过端口转发加nginx代理实现内网访问外网

首先介绍下主要需求,很简单,就是要在医院his系统内嵌公司的平台,实现内网直接访问外网 这是院方给我提供的网闸相关配置,105是医院内网的服务器,120是外网的服务器,中间通过网闸配置的几个端口实现互通 首先我们需要用windos的netsh命令增加一条端口转发规则 172.16.20.105的10002端口转发到172.16.21.27的10003端口 然后我们在27服务器上的10003端口启动sso服务以供调用,调用之后返回 然后需要在27上做一个nginx代理以实现对外网的访问 最后我们在

从无人货架到无人售货柜,加了二维码就叫“新零售”吗?

近日,京东到家宣布,其新一代智能货柜--京东到家Go已正式对外运营.预计年底前京东到家Go将会覆盖包括北上广深在内的全国10个以上主要城市.随着京东到家Go的入局,国内无人售货柜市场已经聚集了众多巨头和创业企业.这个小小的柜子,似乎要承载企业切入"新零售"风口的重任. 但事实上,无人货架.无人售货柜并不是什么稀罕事物.其与原型自动售货机有着太多的相似之处,后者于上世纪70年代就在日本发展起来.而到了80年代,日本就已广泛使用自动售货机.来自JVMA的数据显示,截止到去年12月,日本已有

郁闷的C小加(二)

郁闷的C小加(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考"郁闷的C小加(一)"),C小加很高兴.但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值.即先把表达式转换为后缀表达式,再求值.这时又要考虑操作数是小数和多位数的情况. 输入 第一行输入一个整数T,共有T组测试数据(T<10). 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算

利用apache+svn+jenkins+maven 实现java环境的自动化构建和部署(二)(网内首发超详细版)

2.4 ssl方式部署apache 2.4.1安装apache ./configure --prefix=/usr/local/apache2 --enable-dav --enable-ssl--enable-so --enable-mods-shared=all make && make install 2.4.2安装svn 安装apr-1.4.6.tar.gz.apr-util-1.5.1.tar.gz.neon-0.29.6.tar.gz同2.2章节部分 unzip sqlite-

好未来2017秋招笔试真题二 --牛客网

好未来2017秋招笔试真题二 --牛客网 链接:https://www.nowcoder.com/questionTerminal/ee5de2e7c45a46a090c1ced2fdc62355来源:牛客网 将一句话的单词进行倒置,标点不倒置.比如 I like beijing. 经过函数后变为:beijing. like I 输入描述: 每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100 输出描述: 依次输出倒置之后的字符串,以空格分割 输入例子: I

Unity3d热更新全书-加载(二)如何在不用AssetBundle的前提下动态加载预设

Unity3D的主要构成大家都知道,首先是场景图,场景图上的节点构成一颗树. 每个节点对应一个GameObject对象 然后每个GameObject有若干个组件 有一些组件会与资源产生关系,比如MeshRenderer会关联材质,材质会关联shader和贴图 场景图的一部分可以被保存为一个预设,prefab. 有时候我们会需要用预设去复用,而预设的加载似乎只能通过AB去打包,其实不然,这里我们有一个开源的库就可以解决这个问题. 为什么不使用AB,可以见上一篇,加载(一),不使用AB一份资源全平台

数字信号处理中为什么要加窗

对模拟信号进行数字处理时,首先要对模拟信号进行采样,采样频率由奈奎斯特采样定理决定.对采样而来的数字信号进行 DTFT处理得到其频谱.由 DTFT的计算公式可知, DTFT的计算需要用到信号的所有采样点,当信号为无限长或者是相当长时,这样的计算不可行也没有实际意义.因此会把信号分成许多一定长度的数据段,然后分段处理. 如果把数据进行分段,相当于对信号进行了加矩形窗的处理,对加窗后的信号做 DFT,将会出现由于加窗而引入的高频分量. 既然加窗不可避免,就选择一个合适的吧.窗的形状有许多种,选用合适

(四十二)、加载大分辨率图片到内存

有些图片的分辨率比较高,把它直接加载到手机内存中之后,会导致堆内存溢出的问题,下面就讲解一下Android的堆内存以及如何在Android应用中加载一个高分辨率的图片的方法. 1  还原堆内存溢出的错误首先来还原一下堆内存溢出的错误.首先在SD卡上放一张照片,分辨率为(3776 X 2520),大小为3.88MB,是我自己用相机拍的一张照片.应用的布局很简单,一个Button一个ImageView,然后按照常规的方式,使用BitmapFactory加载一张照片并使用一个ImageView展示.代