1.废话
上次说到了图片的读取和写入到本地,这次说一下图片的格式相关。
位图和矢量图
photoshop处理出来的图片肯定叫做图片,那么coreDraw处理出来的图片是不是也叫图片。
之间就有区分,一种叫做位图,一种叫做矢量图
位图和矢量图在定义、分辨率、色彩丰富度、文件大小和绘制工具等方面存在显著差异。选择使用哪种类型的图像取决于具体的应用场景和需求。例如,如果需要制作色彩丰富、逼真的自然景象或照片,位图是更好的选择;而如果需要制作可无限放大且不失真的Logo、图标或图形设计,矢量图则更为合适。
- 位图:
- 也称为点阵图像或栅格图像,由像素(图片元素)的单个点组成。
- 每个像素点都有特定的位置和颜色信息。
- 存储原理是将图片的每一个像素点的颜色保存起来。
- 与分辨率紧密相关,分辨率越高,图像越清晰。
- 放大图像时,像素点也会放大,导致图像出现马赛克状,即失真现象。
- 色彩丰富,能够制作出色彩和亮度变化丰富的图像。
- 可以逼真地表现自然界各类实物。
- 矢量图:
- 也称为面向对象的图像或绘图图像,在数学上定义为一系列由点连接的线。
- 矢量文件中的图形元素称为对象,每个对象都是一个自成一体的实体,具有颜色、形状、轮廓、大小和屏幕位置等属性。
- 存储原理是使用一系列数学方程表示图片中的线条,再另外保存每个区域的颜色信息。
- 与分辨率无关,可以无限放大而不失真。
- 无论放大、缩小或旋转,都保持清晰度和图像质量。
- 色彩相对不丰富,难以表现色彩层次丰富的逼真图像效果。
- 常用于表示标识、图标、Logo等简单直接的图像。
我们处理的当然是位图,至于矢量图我们是不关心的,这里只是作为图像概念的扩充。
图像在硬盘中保存的时候有多种格式,比如说jpg,png这种
那么硬盘上的图像文件主要的经常用到的格式有哪些呢
- BMP格式:
- 全称:BitMaP
- 与硬件设备无关的图像文件格式
- 使用位映射存储格式,不采用其他任何压缩,因此文件占用空间较大
- 图像深度可选lbit、4bit、8bit及24bit
- Windows环境中运行的图形图像软件都支持BMP图像格式
- JPEG格式:
- 全称:Joint Photographic Experts Group
- 俗称:JPG
- 一种有损压缩格式
- 优点:图像压缩在很小的储存空间,适合网络传输
- 缺点:图像中重复或不重要的资料会被丢失,容易造成图像数据的损伤
- PNG格式:
- 全称:Portable Network Graphics
- 优点:提供无损压缩图像文件,长度比GIF小30%
- 支持24位和48位真彩色图像
- 支持透明背景和变显图像
- GIF格式:
- 全称:Graphics Interchange Format
- 优点:支持透明背景和动画
- 只支持256色
- 压缩率一般在50%左右
- TIFF格式:
- 全称:Tagged Image File Format
- 优点:无损压缩,2-3倍的压缩比
- RAW格式:
- 未经处理直接从CCD或CMOS上所得到的原始图像信息
- 文件超大,但特别适合后期出片调整
此外,还有其他一些格式如PSD(Photoshop的源文件格式)、AI(Adobe Illustrator的文件格式)、EPS(封装的PostScript文件)等,这些格式通常用于专业的图形设计和编辑软件。
在halcon中的图像格式有哪些呢?
当我们读取一张图片进来的时候,我们按照彩色和黑白分,有通道数的概念。
三通道的可以表示彩色图像,单通道的只能是黑白图像。
举个例子:
我们读取了一张图像,这张图像在硬盘中是jpg格式,那么读取到halcon中,看得出来是带颜色的,旁边有棕色的桌面。
我们把鼠标指向变量窗口看一下。
出来一个框,看起来这张图的通道数是3
也就是说这是一张三通道的图,不难理解,这个三个通道应该就是RGB三通道。
这张图的类型是byte,什么意思呢,就是每个通道的像素的灰度值,取值范围是0-255。
用byte 一个字节表示,8bit表示,换算到十进制就是0-255.
在halcon中除了常用的byte格式之外,还有real格式(灰度值取值范围类似于float)
uint2格式,灰度值取值范围为0-65535
同理,int2格式的取值范围为-32768-32767
halcon中图像像素灰度值的存储内存不同,格式不同,一共如上图所示。
2.彩色图像转黑白图像
跟着我们上面的步骤,我们读进来一张三通道的图,那么我们把通道给分开
把每个通道给分出来,使用下面的算子
decompose3 (Image2, Image1, Image21, Image3)
将一张三通道的图片分成三张单通道的图片,合理
目前三张都是黑白的图片了。
那假如说我现在手里有三张黑白的图片 byte类型的,我想合成一张彩色的图像怎么做的
下面这个算子
compose3 (Image1, Image1, Image1, MultiChannelImage)
这两个算子还有很多类似的算子
不光可以拆分或者合并三通道的,若干通道的都行。
为什么我们要拆分彩色图片呢,因为多通道图片多了一个通道维度,很多时候不好处理,很多算子对应的目标都是单通道图片,所以我们就拆分通道分别处理。
彩色转黑白图
不想拆分通道,简单点,之间将彩色图转黑白,使用下面算子
rgb1_to_gray (Image2, GrayImage)
这个算子就是将三个通道的值按照一定比例相乘相加得到新图片的灰度值(单通道的)
具体比例系数是
好的,处理完彩色图像之后如下图所示
3.byte转real
0-255对于我来说不够用,我想要每个像素的灰度值表示为小数
这时候就需要用到我们的real格式
转图像合适的算子如下:
convert_image_type (GrayImage, ImageConverted, 'real')
在转换的时候记得注意,如果是小转大:
比如说byte转real,那么直接转,不会丢失精度;
如果说是real转byte,大于255的灰度值会变为255,灰度值为小数的会忽略掉后面的小数。
这个需要注意,以免出现图像处理异常。
转换之后我们得到了real格式的图像。
同理,其他格式也是这么转换过来的,不同的格式适用于不同的计算场景。
常规的机器视觉,byte类型图像完全够用,设计到3d视觉,需要用到深度图的,那么uint2格式的深度图能够更加适合。
4.叮嘱
另外如果是特殊格式需要保存到本地的话,建议都用tiff格式,其他格式可能会出现意想不到的问题。
比如我现在有一张5通道的图片,前三个通道的颜色信息,第四个通道是法向量信息,第五个通道是高度信息,那么我将这张图存成bmp格式就会出现问题。
另外png格式理论上来说可以保存单通道的图像,也可以保存4个通道的图像,第四个通道是透明度通道,因为png格式图片允许其中某些像素是透明的,而bmp格式就不允许了。