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格式就不允許了。