一,概述

一般,对图片进行二值化时,我们会先进行灰度化,再进行阈值处理,既可以自己根据灰度图片本身设置阈值,也可以根据graythresh函数自动确定阈值,如下:

I = imread('input1.jpg');
[h, w, src] = size(I);
if src == 3I = rgb2gray(I);
end
a = 160;
%I = I > a;
I = im2bw(I, graythresh(I) * 0.9);
imshow(I);imwrite(I, 'test.jpg');

但是这样做的效果往往不是很好,因为二值图最后的结果往往模糊不清,不具备层次感。本文提出了一种算法,将灰度图转换成层次分明的二值图,下面是对比图:

原图                阈值确定的二值图               层次分明的二值图

二,算法思路

由于二值图中的像素要么是0,要么是1,因此我们不能依靠色阶来产生二值图层次分明的效果,我们只能使较暗的地方像素多些,较亮的地方像素少些,因此本文采用了模板的方法,通过原图与模板进行像素大小的比较,根据概率高低可以保证较暗的地方像素多,较亮的地方像素少。算法的大致思路分为以下几个部分:

1),本文采用了4*4的模板,因此需要将原图尺寸的大小扩充至4的整数倍,为保证原图尽量不被拉伸,若原图的高为w,宽为h,则设置新的高W = floor(w / 4.0) + 1,

H = floor(h / 4.0) + 1;

2),设置模板,若将原图片以4*4的小矩阵为单位进行分割,如下,之后再对每个小矩阵分别与模板进行比较。为了保证图片效果的随机性,每次进行比较的模板都应该具备随机性。

对于模板的设置,可以先使template = 1: 16,然后利用随机数rand(1)随机打乱,最后再变形成矩阵,由于灰度值的范围为0~255,因此最后对模板的每个像素都应乘以16或者15,才能保证随机性。

3),上一步基本上能将原图的效果显示出来,但可能由于随机性的关系造成了轮廓有些不清晰,因此需要从原始灰度图中提供轮廓,再与上一步生成的二值图进行或操作。

三,具体代码

程序如下,太部分语句比较基础,就不细述了,其中代码1是根据上述算法流程写的,代码2为调用的随机模板:

注意的地方:使用rand(1)函数时,即使round(rand(1)*16),最后的整数结果可能为0,而matlab中的下标都是从1开始,因此需要重新取随机值。

代码1:

clear; clc;
%读入原图灰度化
I = imread('input1.jpg');
[h, w, src] = size(I);
if src == 3I = rgb2gray(I);
end
figure,
subplot(211), imshow(I), title('原始灰度图像');
subplot(212), plot(imhist(I)/(h*w)), title('直方图');
%imshow(I), title('原始灰度图像');
%扩展图像高和宽为4K, K为整数
a = 4.0;
k1 = floor(h / a) + 1;
k2 = floor(w / a) + 1;
M = k1 * a;
N = k2 * a;
I = imresize(I, [M, N]);
figure, imshow(I), title('4的整数倍图像灰度图像');
%利用随机模板生成二值化图
I_er = zeros(M, N);
for i = 1: a: Mfor j = 1: a: NnewTemplate = RandomTemplate();I_er(i: i+a-1, j: j+a-1) = I(i: i+a-1, j: j+a-1) > newTemplate;end
end
%随机模板造成轮廓不清晰,需要|原来的轮廓
I = im2double(I);
imX = [abs(I(:,1:(end-1)) - I(:,2:end)), zeros(M, 1)];%最右边增加一列0
imY = [abs(I(1:(end-1),:) - I(2:end,:)); zeros(1, N)];%最下边增加一行0
imX = imX .^ 2;
imY = imY .^ 2;
imEdge = sqrt(imX + imY);
imEdge = immultiply(imEdge, 5);
imEdge = imEdge .^ 50;%次数越多,数值越低,黑色像素越少
imEdge = uint8(imEdge .* 255);
imEdge = im2bw(imEdge, graythresh(imEdge)*0.4);
figure, imshow(imEdge);
figure, imshow(I_er), title('二值图像I_er');
imwrite(I_er, 'shili.bmp');
I_er1 = ~(~I_er | imEdge);
figure, imshow(I_er1), title('二值图像I_er1');
imwrite(I_er1, 'shili1.bmp');

代码2:随机模板取值函数

function newTemplate = RandomTemplate()newTemplate = 1: 16;%将数字1,2...16随机放在newTemplate中,根据rand进行16次置换for i = 1: 16num = round(rand(1)*16);while num == 0num = round(rand(1)*16);endtemp = newTemplate(i);newTemplate(i) = newTemplate(num);newTemplate(num) = temp;endnewTemplate = 15 * reshape(newTemplate, 4, 4);%16时黑点过多,效果不好
end

四,一些展示

原始图                               模板生成的二值图

说明:

如果将图片放大的话,我们能看到如下的图,这是因为二值图只有0和1两种像素,需要靠黑像素多少来造成明暗分布的效果:

如何将jpg,bmp等普通图片转成层次分明的二值图片(非仅用阈值分割)相关推荐

  1. 【opencv】边缘提取或通过二值图片提取对应的三维图像(python)

    简述 原图 二值图(经过膨化处理) 提取出来的图片 代码实现 import cv2img = cv2.imread('corgi.jpg') data = (150, 150) imgCanny = ...

  2. matlab 读二值图片,二值图像

    二值图像(Binary Image)是指将图像上的每一个像素只有两种可能的取值或灰度等级状态,人们经常用黑白.B&W.单色图像表示二值图像. 二值图像是指在图像中,灰度等级只有两种,也就是说, ...

  3. opencv-python基础用法详细代码-图片加载-ROI-边缘滤波-二值化-轮廓提取-膨胀腐蚀等

    目录 1.1图像的导入和导出 1.2像素运算 1.3ROI与填充 1.4模糊与锐化操作 1.5边缘保留滤波 1.6图像二值化 1.7图像直方图 1.8绘制外轮廓 1.9对象测量 1.10区分指定外轮廓 ...

  4. php 图片二值化在线,图片处理完整流程(包含二值化处理、对黑白照片降噪、边缘去黑像素、三通道转为一通道、图片转array、图片转成任意像素等功能)——可满足一般图片处理要求...

    因为注释给的很详细,所以直接给代码: 1 from PIL import Image 2 # 二值化处理 3 4 5 def 二值化处理(image): 6 for i in range(1, 5): ...

  5. 二值图片连续区域检测

    https://www.cnblogs.com/ronny/p/img_aly_01.html 检测2行是否有重叠区域,即保证下一行的开头小于上一行的结尾同时下一行的结尾大于上一行的开头,2条件同时满 ...

  6. bmp图片灰度化和二值化

    C语言去除bmp图片的背景 一.前言 二.灰度化 头文件 C文件 三.二值化 一.前言 图像处理中,大部分的处理方法都需要事先把彩色图转换成灰度图才能进行相关的计算.识别. 彩色图转换灰度图的原理如下 ...

  7. C语言实现将彩色BMP位图转化为二值图

    2019独角兽企业重金招聘Python工程师标准>>> CTF做了图片的隐写题,还没有形成系统的认识,先来总结一下BMP图的组成,并通过将彩色图转为二值图的例子加深下理解. 只写了位 ...

  8. ph值图片_人体血液正常PH值图片

    人体血液正常PH值图片 发布时间:2019-12-11 15:01:15 作者:百年养生网 出处:百年养生网 本页是关于人体血液正常PH值的图片,图片所在的文章是:<20131010养生堂视频和 ...

  9. 更改图片位置_如何轻松快速地将图片转换到JPG/JPEG/PNG/BMP/TIFF

    万兴优转可用作为图片转换器,帮助您批量更改图片格式,且不会丢失任何质量.例如,您可以将PNG转换到JPG或其他格式,反之亦然.您还可以通过更改图片宽度和高度来调整图片大小,或者通过裁剪,旋转,添加效果 ...

最新文章

  1. CVPR 2022 | 华南理工提出VISTA:双跨视角空间注意力机制实现3D目标检测SOTA,即插即用...
  2. 动态加载jar 并进行调用
  3. Linq let Concat
  4. 关于FillSchema与Fill
  5. boost::detail::spinlock相关的测试程序
  6. java 命名约定_Java命名约定
  7. Java面向对象(16)--单例(Singleton)设计模式
  8. linux frame buffer 显示图片 没有颜色,新路程----linux framebuffer显示图片c程序
  9. mysql查找有小数点的数据_MySQL中查询中位数?
  10. 商业智能bi能带来什么价值
  11. 计算机0表示负数,计算机原码反码补码_0
  12. 一文讲清微服务架构、分布式架构、微服务、SOA
  13. ps出现标尺的快捷键,隐藏参考线,把隐藏的参考线显示出来的快捷键。
  14. 菜菜的刷题日记 | 215. 数组中的第K个最大元素
  15. java 时区处理_JAVA时区处理(转)
  16. # 1450: 发工资咯
  17. java.lang.StringIndexOutOfBoundsException
  18. java 用户留存率_【java】mongodb 数据统计(留存率) 应该怎么实现?
  19. 黑盒测试方法-----状态转换图
  20. win11打不开菜单怎么办?win11打不开开始菜单的9种解决方法

热门文章

  1. 与另一台计算机建立ipc,利用IPC$开启他人电脑远程桌面
  2. 模块上微系统(SOM)行业调研报告 - 市场现状分析与发展前景预测
  3. Hello Tarjan ---- Tarjan算法小结
  4. 深圳市地方金融监督管理局支持黄金珠宝消费券试点“数字货币”
  5. 问道神兵天降服务器维护,《问道》手游安卓/IOS服务器10月27日5:30维护公告
  6. 51nod初学者习题(一)
  7. (论文加源码)基于时频域特征分析和SVM分类器的DEAP脑电信号情感状态识别(matlab代码)(四分类)
  8. 圆周率一千万亿位_圆周率被算到31.4万亿位,它的终点是宇宙奇点?爱因斯坦说对了?...
  9. Linux图形子系统之GEM内存管理
  10. 逆市稳进的基本盘 苏宁赢了什么?