2020-03-05 11:10:48 qq_27524749 阅读数 30

最近一直在用bmp格式的图片进行图像算法的学习,对bmp来做一个整理,以备后面使用。

BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式。由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源。Windows的图形用户界面(graphical user interfaces)也在它的内建图像子系统GDI中对BMP格式提供了支持。

BMP文件的数据按照从文件头开始的先后顺序分为四个部分:

bmp文件头(bmp file header):提供文件的格式、大小等信息

位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息

调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表

位图数据(bitmap data):就是图像数据啦

从C语言中对他们的定义可以看一下

(1)bmp文件头(占14字节

typedef struct tagBITMAPFILEHEADER {
        WORD    bfType; //文件的类型,占2个字节
        DWORD   bfSize; //文件的大小,占4个字节
        WORD    bfReserved1; //保留位1,占2个字节
        WORD    bfReserved2; //保留位2,占2个字节
        DWORD   bfOffBits; //从文件开始到位图数据开始之间的数据量,称为偏移量:偏移量大小=位图文件头大小+位图信息头大小+调色板大小。占4个字节
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;

(2)位图信息头(占40字节

typedef struct tagBITMAPINFOHEADER{
        DWORD      biSize; //位图信息头的大小,4个字节。
        LONG       biWidth; //位图的宽度,单位为像素点,4个字节。
        LONG       biHeight; //位图的长度,单位为像素点,4个字节。
        WORD       biPlanes; //位图的位面数,总是1,2个字节。
        WORD       biBitCount; //位图的像素位数,即每个像素点所占的位数,2个字节。
        DWORD      biCompression; //位图的压缩说明:0 - 不压缩 (使用BI_RGB表示)1 - RLE 8-使用8位RLE压缩方式(用BI_RLE8表示)2 - RLE 4-使用4位RLE压缩方式(用BI_RLE4表示)3 - Bitfields-位域存放方式(用BI_BITFIELDS表示),4个字节。
        DWORD      biSizeImage; //位图数据的大小,必须是4的倍数,4个字节。
        LONG       biXPelsPerMeter; //用像素/米表示的水平分辨率,4个字节。
        LONG       biYPelsPerMeter;//用像素/米表示的垂直分辨率,4个字节。
        DWORD      biClrUsed; //文件使用的颜色数。如果为0,则表示使用了全部可能的颜色。如8-比特/象素表示为0x100或者 256,4个字节。
        DWORD      biClrImportant; //指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要,4个字节。
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;

(3)调色板(调色板大小可选,大小为N*4(bytes),其中N表示颜色的数目

typedef struct tagRGBQUAD {
        BYTE    rgbBlue;//蓝色分量
        BYTE    rgbGreen;//绿色分量
        BYTE    rgbRed;//红色分量
        BYTE    rgbReserved;//蓝保留位
} RGBQUAD;

(4)位图数据(根据图片不同所占大小而不同):

位图数据就是对应的数组,可以有多种格式,RGB、YUV、HSV等等。

2014-11-03 22:22:30 sweet_dew 阅读数 8613

      第一次接触用c++进行图像处理,首先就是对于裸格式.RAW的图片进行处理,在网上也是找了很久,但是都没有合适的,知识搜集到一些信息,就是说.raw8位二进,,很好处理,然后就没有搜集到更多的信息了,首先申明自己是刚入手c++,有些c语言的基础,很是羞愧与自己都研究生了,编码竟然还那么弱,没办法啊,被大神鄙视心里还是有点不舒服的,

      首先之前完全不了解图片的格式,研究了一下.bmp的格式之后才联想到,如果要是读取.raw格式的图像数据,我就必须清楚这种格式的RGB是怎么存储的,也是研究墨迹两天,加上c++语言上面的不熟悉,最后在另一位大神的帮助下,终于弄明白了。

      不得不赞美下大神的思路真的是很明确,而我就是一团混乱,这也是我学习的地方,大神先是让我用UE打开这个数据文件.raw让我看下到底这个文件时怎么存储的,下图就是

原图256*256


   

     在大神的帮助下,调通了程序,我发现是我的编程习惯不好,一些函数不会看格式,不会按照规矩来,在一遍遍的测试下,闹清楚,原来raw格式存储的图像,是按照RGB的值依次存储,我提取了R波段的值,在提取了B波段的值,依次,(.raw原图是三通道)


下面放程序吧:很简单的程序啊,就是要弄清楚RGB在,.raw的村粗方式就行了,

#include "StdAfx.h"


#include <fstream>
#include <stdio.h>
//#include <readline/readline.h>
//#include <readline/history.h>
#include <stdlib.h>
//#include <sting.h>
const int R = 256;
const int L = 256;

int main(int argc,char **argv)

    const char *file_name="G:\\UCMerced_LandUse-十类图像\\binary images\\agricultural001.raw";  
FILE *fp,*fp1,*fp2,*fp3;

fp=fopen(file_name,"rb");
int k=0;


if(fp==NULL)
    {
      printf("\nerror on open c:\\hzk16 file!");


    }
fp1=fopen("BAND1.raw","wb");
fp2=fopen("BAND2.raw","wb");
fp3=fopen("BAND3.raw","wb");
if(fp==NULL)
    {
      printf("\nerror on open c:\\hzk16 file!");


    }

unsigned char image1[R][L];
    unsigned char image2[R][L];
unsigned char image3[R][L];


;
//把image内容写入到
fread(image2,sizeof(unsigned char),R*L,fp);//注意fp指针一直加1,不能调换成fp2
fwrite(image2,sizeof(unsigned char),R*L,fp2);
fread(image3,sizeof(unsigned char),R*L,fp);
fwrite(image3,sizeof(unsigned char),R*L,fp3);



fclose(fp2);
fclose(fp3);

}



接下来还要对图像标注,已经能画出矩形框,但是还不能实现函数化,libsvm库已经安装好,接下来会更艰难。

2018-01-17 19:14:39 ChenVast 阅读数 1848

图像处理:

#coding=utf-8
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
# 读取图片
image_raw_data = tf.gfile.FastGFile ("../datasets/cat.jpg", 'rb').read ()

with tf.Session () as sess:
    img_data = tf.image.decode_jpeg (image_raw_data)

    # 输出解码之后的三维矩阵。
    print(img_data.eval ())
    img_data.set_shape ([1797, 2673, 3])
    print(img_data.get_shape ())

# 打印图片
with tf.Session() as sess:
    plt.imshow(img_data.eval())
    plt.show()

# 重新调整图片大小
with tf.Session () as sess:
    resized = tf.image.resize_images (img_data, [300, 300], method=0)

    # TensorFlow的函数处理图片后存储的数据是float32格式的,需要转换成uint8才能正确打印图片。
    print("Digital type: ", resized.dtype)

    cat = np.asarray (resized.eval (), dtype='uint8')
    # tf.image.convert_image_dtype(rgb_image, tf.float32)
    plt.imshow (cat)
    plt.show ()

# 裁剪和填充图片
with tf.Session() as sess:
    croped = tf.image.resize_image_with_crop_or_pad(img_data, 1000, 1000)
    padded = tf.image.resize_image_with_crop_or_pad(img_data, 3000, 3000)
    plt.imshow(croped.eval())
    plt.show()
    plt.imshow(padded.eval())
    plt.show()


# 截取中间50%的图片
with tf.Session() as sess:
    central_cropped = tf.image.central_crop(img_data, 0.5)
    plt.imshow(central_cropped.eval())
    plt.show()

# 翻转图片
with tf.Session () as sess:
    # 上下翻转
    # flipped1 = tf.image.flip_up_down(img_data)
    # 左右翻转
    # flipped2 = tf.image.flip_left_right(img_data)

    # 对角线翻转
    transposed = tf.image.transpose_image (img_data)
    plt.imshow (transposed.eval ())
    plt.show ()

    # 以一定概率上下翻转图片。
    # flipped = tf.image.random_flip_up_down(img_data)
    # 以一定概率左右翻转图片。
    # flipped = tf.image.random_flip_left_right(img_data)


# 图片色彩调整
with tf.Session () as sess:
    # 将图片的亮度-0.5。
    # adjusted = tf.image.adjust_brightness(img_data, -0.5)

    # 将图片的亮度-0.5
    # adjusted = tf.image.adjust_brightness(img_data, 0.5)

    # 在[-max_delta, max_delta)的范围随机调整图片的亮度。
    adjusted = tf.image.random_brightness (img_data, max_delta=0.5)

    # 将图片的对比度-5
    # adjusted = tf.image.adjust_contrast(img_data, -5)

    # 将图片的对比度+5
    # adjusted = tf.image.adjust_contrast(img_data, 5)

    # 在[lower, upper]的范围随机调整图的对比度。
    # adjusted = tf.image.random_contrast(img_data, lower, upper)

    plt.imshow (adjusted.eval ())
    plt.show ()


#  添加色相和饱和度
with tf.Session () as sess:
    adjusted = tf.image.adjust_hue (img_data, 0.1)
    # adjusted = tf.image.adjust_hue(img_data, 0.3)
    # adjusted = tf.image.adjust_hue(img_data, 0.6)
    # adjusted = tf.image.adjust_hue(img_data, 0.9)

    # 在[-max_delta, max_delta]的范围随机调整图片的色相。max_delta的取值在[0, 0.5]之间。
    # adjusted = tf.image.random_hue(image, max_delta)

    # 将图片的饱和度-5。
    # adjusted = tf.image.adjust_saturation(img_data, -5)
    # 将图片的饱和度+5。
    # adjusted = tf.image.adjust_saturation(img_data, 5)
    # 在[lower, upper]的范围随机调整图的饱和度。
    # adjusted = tf.image.random_saturation(img_data, lower, upper)

    # 将代表一张图片的三维矩阵中的数字均值变为0,方差变为1。
    # adjusted = tf.image.per_image_whitening(img_data)

    plt.imshow (adjusted.eval ())
    plt.show ()


# 添加标注框并裁减。
with tf.Session () as sess:
    boxes = tf.constant ([[[0.05, 0.05, 0.9, 0.7], [0.35, 0.47, 0.5, 0.56]]])

    begin, size, bbox_for_draw = tf.image.sample_distorted_bounding_box (
        tf.shape (img_data), bounding_boxes=boxes)

    batched = tf.expand_dims (tf.image.convert_image_dtype (img_data, tf.float32), 0)
    image_with_box = tf.image.draw_bounding_boxes (batched, bbox_for_draw)

    distorted_image = tf.slice (img_data, begin, size)
    plt.imshow (distorted_image.eval ())
    plt.show ()



一张图片产生多种随机训练数据:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt


# 随机调整图片的色彩,定义两种顺序。
def distort_color(image, color_ordering=0):
    if color_ordering == 0:
        image = tf.image.random_brightness(image, max_delta=32./255.)
        image = tf.image.random_saturation(image, lower=0.5, upper=1.5)
        image = tf.image.random_hue(image, max_delta=0.2)
        image = tf.image.random_contrast(image, lower=0.5, upper=1.5)
    else:
        image = tf.image.random_saturation(image, lower=0.5, upper=1.5)
        image = tf.image.random_brightness(image, max_delta=32./255.)
        image = tf.image.random_contrast(image, lower=0.5, upper=1.5)
        image = tf.image.random_hue(image, max_delta=0.2)

    return tf.clip_by_value(image, 0.0, 1.0)


#  对图片进行预处理,将图片转化成神经网络的输入层数据。
def preprocess_for_train(image, height, width, bbox):
    # 查看是否存在标注框。
    if bbox is None:
        bbox = tf.constant ([0.0, 0.0, 1.0, 1.0], dtype=tf.float32, shape=[1, 1, 4])
    if image.dtype != tf.float32:
        image = tf.image.convert_image_dtype (image, dtype=tf.float32)

    # 随机的截取图片中一个块。
    bbox_begin, bbox_size, _ = tf.image.sample_distorted_bounding_box (
        tf.shape (image), bounding_boxes=bbox,min_object_covered=0.1)
    bbox_begin, bbox_size, _ = tf.image.sample_distorted_bounding_box (
        tf.shape (image), bounding_boxes=bbox,min_object_covered=0.1)
    distorted_image = tf.slice (image, bbox_begin, bbox_size)

    # 将随机截取的图片调整为神经网络输入层的大小。
    distorted_image = tf.image.resize_images (distorted_image, [height, width], method=np.random.randint (4))
    distorted_image = tf.image.random_flip_left_right (distorted_image)
    distorted_image = distort_color (distorted_image, np.random.randint (2))
    return distorted_image


# 读取图片
image_raw_data = tf.gfile.FastGFile("../datasets/cat.jpg", "rb").read()
with tf.Session() as sess:
    img_data = tf.image.decode_jpeg(image_raw_data)
    boxes = tf.constant([[[0.05, 0.05, 0.9, 0.7], [0.35, 0.47, 0.5, 0.56]]])
    for i in range(9):
        result = preprocess_for_train(img_data, 299, 299, boxes)
        plt.imshow(result.eval())
        plt.show()


2019-03-21 16:29:02 weixin_42799463 阅读数 55

TensorFlow图像处理函数

TensorFlow对jpeg图像处理编码解码

import tensorflow as tf
import matplotlib.pyplot as plt

#读取图像的原始数据
image_raw_data= tf.gfile.FastGFile("/目录/图片名字.jpeg","rb").read()

with tf.Session() as sess:
    #对图像进行jpeg的格式解码从而得到图像对应的三维矩阵。
    #解码之后的结果为一个张量,在使用它的取值之前需要明确调用运行的过程
    image_data=tf.image.decode_jpeg(image_raw_data)

    print(image_data.eval())
    plt.imshow(image_data.eval())
    plt.show()

书上原先的代码会报错如下:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: inva

解决方案:

image_raw_data= tf.gfile.FastGFile("/目录/图片名字.jpeg","r").read()
替换为
image_raw_data= tf.gfile.FastGFile("/目录/图片名字.jpeg","rb").read()
2013-10-19 22:13:12 hyanglu1573 阅读数 2463

对于OV5642输出视频格式,可以使用RAWBayer模式。这种格式传输的是Sensor最原始的感光数据,没有经过处理,具有更好的清晰度和图像显示效果。OV5642的RAW Bayer像素点格式如下所示。


对于原始的RAW Bayer格式数据,需要转换成RGB像素点格式才能显示出图像。对于RAW和RGB之间的转换还是有一点复杂,在测试阶段可以使用一种简单的方法,即将相邻的四个像素点合并为一个,取其B、R和Gb最为RGB的三个元素来显示。使用这种方法,使得图像横竖的分辨率都减半,最终的图像大小减为原来的四分之一。

使用Matlab显示RAW Bayer图像的代码如下。

clear all;

clc;

fid = fopen('camera3.raw', 'r' );

if fid == -1

    error('Cannot open file.');

end

hor = 2592;

ver = 1944;

for i=1:ver

    picture(i,:) = fread(fid, hor, 'uint16');

end

fclose(fid);

picture = round((picture ./ 1024) * 256);

r = uint8(zeros(ver/2, hor/2));

g = uint8(zeros(ver/2, hor/2));

b = uint8(zeros(ver/2, hor/2));

r_temp = picture(:, 2:2:hor);

r = r_temp(2:2:ver, :);

g_temp = picture(:, 2:2:hor);

g = g_temp(1:2:ver, :);

b_temp = picture(:, 1:2:hor);

b = b_temp(1:2:ver, :);

rgb(:, :, 1) = r;

rgb(:, :, 2) = g;

rgb(:, :, 3) = b;

figure,imshow(rgb);




 

图像处理实例

阅读数 29

没有更多推荐了,返回首页