python实现半色调技术图像转换
半色调技术
半色调技术是一种将灰度图像转换为黑白图像的技术。它是通过将灰度图像的像素值映射到黑白像素值上来实现的。
比如说,在一块只能显示纯黑或纯白的屏幕上,如何将一张灰度图显示出灰度的效果,这时就可以用半色调技术实现。
如下,左边是一张灰度图,中间是使用半色调技术转换后输出的图像,右边是输出图像的局部放大
| 初始灰度图 | 半色调转换后的输出图像 | 输出图像局部放大(使用win10自带【画图】软件打开放大) |
|---|---|---|
![]() | ![]() | ![]() |
原理
基本原理
我们都知道,一个像素点有0~255共256种灰度值,值越大图像越“白”,反之越“黑”。
对于一些屏幕,只能显示0或1(用1表示255)两种灰度值,也就是只能显示纯黑或纯白,这怎么办?
半色调技术实际是把一个像素点用一个矩阵块来表示,如果像素值比较大(越白),那么矩阵快白色部分就越多,如图所示:

这个矩阵就是bayer矩阵,矩阵边长可以选择1,2,4,8,16,上图矩阵边长是2
如果是16,那么就可以表示16*16=256种灰度值了
如上图所示,对于边长为2的bayer矩阵,假如只有4种颜色值(0,1,2,3),如果像素值比0大,那么就把bayer矩阵的位置0设置为白色;如果比1大,就把位置0和1都设置为白色……
但实际上,灰度值有256种,因此bayer矩阵需要乘以(256/(2*2)),如下

如果像素值比128大,那么0,64,128这3个位置都设置为白色
可以看出,假设输入图像边长为a,bayer矩阵边长为k,则输出图像的边长为a*k,即是输入图像的k倍
bayer矩阵生成

注意:整数*矩阵即矩阵的数乘运算,相当于矩阵每个元素都乘以一个整数
根据这个公式,可以写出一个代码:
def getStandardMat(k):'''函数作用:获取bayer矩阵return:是否生成成功,成功的话同时返回numpy类型的矩阵k: 是bayer矩阵的阶数,取值一般为1 2 4 8 16'''if k & (k-1) != 0:return False, Noneif k == 1:return True, [[0.5]]m = [[0, 2], [3, 1]]m = np.array(m)while(m.shape[0] != k):m1 = np.zeros((m.shape[0]*2, m.shape[1]*2))m1[:m.shape[0], :m.shape[1]] += 4*mm1[:m.shape[0], m.shape[1]:] += 4*m+2m1[m.shape[0]:, :m.shape[1]] += 4*m+3m1[m.shape[0]:, m.shape[1]:] += 4*m+1m = m1return True, m
测试一下:
![]() | ![]() | ![]() |
|---|
实践操作
该程序实现读取一张RGB图片,转为灰度图后再采用变色调技术转换图片
使用该程序只需要修改输入图片路径以及输出图片路径即可
# 该文件实现半色调技术的代码import cv2
import numpy as npdef getBayerMat(k):'''函数作用:获取bayer矩阵return:是否生成成功,成功的话同时返回numpy类型的矩阵k: 是bayer矩阵的阶数,取值一般为1 2 4 8 16'''if k & (k-1) != 0:return False, Noneif k == 1:return True, np.array([[0.5]])m = [[0, 2], [3, 1]]m = np.array(m)while(m.shape[0] != k):m1 = np.zeros((m.shape[0]*2, m.shape[1]*2))m1[:m.shape[0], :m.shape[1]] += 4*mm1[:m.shape[0], m.shape[1]:] += 4*m+2m1[m.shape[0]:, :m.shape[1]] += 4*m+3m1[m.shape[0]:, m.shape[1]:] += 4*m+1m = m1return True, mdef convertImg(img, k=4, f=False, useGray=False):'''k:bayer矩阵大小f:由于转换后图像尺寸会变大k倍,f表示是否先缩小k倍useGray:传入的img是否为灰度图'''if not useGray:img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)if f:img = cv2.resize(img, dsize=None, fx=1/k, fy=1/k)ret, bayers = getBayerMat(k)if not ret:print(f"矩阵阶数k={k}非2的倍数")returnbayers *= (256//(k*k))h, w = img.shapenewImg = np.zeros((k*h, k*w), dtype='uint8')# 遍历图像每个像素点for i in range(0, h, 1):for j in range(0, w, 1):# 对于每个像素点,遍历bayer矩阵,判断是否该把矩阵中某一位置设置为纯白(255)或纯黑(0)for p in range(k): for q in range(k):if img[i][j] > bayers[p][q]:newImg[k*(i)+p][k*(j)+q] = 255else:newImg[k*(i)+p][k*(j)+q] = 0return newImgif __name__ == '__main__':imgPath = r'D:\Users\xxx\Desktop\imgs\1-1.jpg'img = cv2.imread(imgPath, 0) # 读取图片并转为灰度图nimg = convertImg(img, k=4, f=False, useGray=True)cv2.imwrite("../out/b2.png", nimg) # 输出转换后的图片
使用pyqt5做一个GUI操作界面
▶代码下载
需要安装的库
PyQt5 5.15.0
opencv-python 4.3.0.36
numpy 1.19.0

使用方法:
运行src/main.py文件即可
> python main.py

相关文章:
python实现半色调技术图像转换
半色调技术 半色调技术是一种将灰度图像转换为黑白图像的技术。它是通过将灰度图像的像素值映射到黑白像素值上来实现的。 比如说,在一块只能显示纯黑或纯白的屏幕上,如何将一张灰度图显示出灰度的效果,这时就可以用半色调技术实现。 如下…...
c++面试技巧-基础篇
1.面试官:简述C语言的优缺点。 应聘者:C语言的优缺点如下。 • C语言的优点:C语言既保留了C语言的有效性、灵活性、便于移植等全部精华和特点,又添加了面向对象编程的支持,具有强大的编程功能,可方便地构…...
三八妇女节即将到来,跨境电商如何玩转节日营销?
随着国际妇女节的到来,跨境电商商家们都开始了为自己的店铺进行节日营销的准备。商家做节日营销的目的都是一样的,无非都是增加曝光率,拉动客流,增加营业额。但是每一个节日营销的形式是可以不一样的。今年有什么营销玩法呢&#…...
【Java学习笔记】10.条件语句 - if...else及switch case 语句
前言 本章介绍Java的条件语句 - if…else和switch case 语句。 Java 条件语句 - if…else Java 中的条件语句允许程序根据条件的不同执行不同的代码块。 一个 if 语句包含一个布尔表达式和一条或多条语句。 语法 if 语句的语法如下: if(布尔表达式) {//如果布…...
解析STM32启动过程
相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方式有了比较大的变化。ARM7/ARM9内核的控制器在复位后,CPU会从存储空间的绝对地址0x000000取出第一条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地址为0x…...
微信小程序开发自学笔记 —— 八、小程序基础库的更新迭代
小程序基础库的更新迭代 小程序基础库 小程序的运行环境是分成渲染层和逻辑层的,在渲染层可以用各类组件组建界面的元素,在逻辑层可以用各类API来处理各种逻辑,组件、API其实都是小程序基础库进行包装提供的,基础库的职责还要处…...
Mysql迁移Postgresql
目录原理环境准备操作系统(Centos7)Mysql客户端安装Psql客户端安装数据库用户空字符串处理成null导表脚本dbmysql2pgmysqlcopy测试在mysql中建表导表测试查看pg中的表原理 Mysql抽取:mysql命令重定向到操作系统文件,处理成csv文件; PG装载&a…...
关于信息安全认证CISP、PTE对比分析
CISP 注册信息安全专业人员 CISP-PTE 注册渗透测试工程师(以下简称PTE) 1 、发证机构 CISP与PTE的发证机构都是中国信息安全测评中心,政府背景给认证做背书,学员信息都在中国政府可控的机构手中; 如果想在政府、国…...
游戏场景编辑器和骨骼动画相关软件
游戏场景编辑器 一.Tiled(2D) Tiled 是帮助你开发游戏内容的 2D 地图编辑器。它的主要功能是可以编辑各种形式的瓦片地图,还支持通过用空图片这种强大的方式来标记额外信息给游戏使用。Tiled 关注的是总体灵活性,同时尽量保持直观性。 Tiled Map 不但…...
vue3常用的API
目录 1.ref函数 2.reactive函数 3.reactive对比ref 4.computed函数 5.watch函数 6.toRef 7..provide && inject 1.ref函数 作用: 定义一个响应式的数据 语法: const xxx ref(initValue) 创建一个包含响应式数据的引用对象(reference对象ÿ…...
Qt中使用
LIB库路径,include 头文件,运行的时候记得吧dll库带上,这基本就完成了。准备工作:Qt可以是傻瓜式的安装就行,GE的驱动里面有exe,直接点击安装即可,完了记得到安装路径把“.h”“.liib”和“.dll…...
controller-runtime搭建operator开发环境
目录 基本结构 注入CRD 基本结构 首先下载相应的go pkg go get -u sigs.k8s.io/controller-runtime 接下来需要创建控制器和Manager Operator的本质是一个可重入的队列编程模式,而Manager可以用来管理Controller、Admission Webhook,包括访问资源对…...
FPGA使用GTX实现SFP光纤收发SDI视频 全网首创略显高端 提供工程源码和技术支持
目录1、前言2、设计思路和框架3、vivado工程详解4、上板调试验证并演示5、福利:工程代码的获取1、前言 FPGA实现SDI视频编解码目前有两种方案: 一是使用专用编解码芯片,比如典型的接收器GS2971,发送器GS2972,优点是简…...
Django 之 CharField 和 TextField
CharField test_char models.CharField(max_length288)设置长度为 288 并不会报错,这取决于你的数据库后端,mysql char 类型长度为 255,django 里面设置超过 255 并不会有提示,个人感觉有点误导人,起码给个警告也行&…...
recyclerview 使用的坑
1.有不同的布局 12_GridLayoutManager setSpanSizeLookup()方法 - 简书 setSpanSizeLookup 这个方法要会 spanCount和 getSpanSize spanCount/getSpanSize() 才是这一项所占的宽度 2.均分 item布局要设置宽度为match_paraent 3.设置完了。发现高度不一样,…...
DBeaver连接mysql、oracle数据库
1. DBeaver连接mysql 1) 下载DBeaver https://dbeaver.io/download/,并安装 2) 新建数据库连接 3)选择mysql驱动程序 4)填写连接设置内容 5)点击 “编辑驱动设置”,并填写相关信息 6)选择本地…...
Kivy GridLayout 布局
Kivy GridLayout 是一种用于构建用户界面的布局类型,可以帮助我们快速创建具有固定列和行的网格布局。GridLayout 布局是可以适用于任意数量的行和列的布局,然后在这些行和列中放置 UI 元素。 Kivy 的 GridLayout 使用起来类似于 HTML 的表格,…...
Spark高手之路2—Spark安装配置
文章目录Spark 运行环境一、Local 模式1. 下载压缩包2.上传到服务器3. 解压4. 启动 Local 环境5. 命令行工具6. 退出本地模式7. 提交应用二、Standalone 模式1. 解压2. 修改配置文件1)进入解压缩后路径的 conf 目录,复制 workers.template 文件为 worker…...
Java中对象的比较
目录元素的比较基本类型的比较引用类型的比较1. 覆写基类的equals2. 基于Comparble接口类的比较3. 基于比较器比较三种方法对比元素的比较 基本类型的比较 这里就拿整型, 字符型, 布尔型 为例: public static void main(String[] args) {int a 10;int b 20;System.out.pri…...
Python编程训练题2
1.11 有 n 盏灯,编号 1~n(0<n<100)。第 1 个人把所有灯打开,第 2 个人按下所有编号为 2 的倍数的开关(这些灯将被关掉),第 3 个人按下所有编号为 3 的倍数的开关(其…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...






