• 常见医疗扫描图像处理步骤一 下载必要包skimage需要更新到最新0.13版本,否则会报错,ImportError: cannot import name label。sudo pip install scikit-image -U -i https://pypi.tuna.tsinghua.edu.cn/simple二 ...

    常见医疗扫描图像处理步骤


    一 下载必要包

    skimage需要更新到最新0.13版本,否则会报错,ImportError: cannot import name label。

    sudo pip install scikit-image  -U -i  https://pypi.tuna.tsinghua.edu.cn/simple

    二 数据格式

    2.1 dicom

    当前医疗竞赛官方数据集格式 data-science-bowl-2017。数据列表如下:
    这里写图片描述
    后缀为 .dcm。
    每个病人的一次扫描CT(scan)可能有几十到一百多个dcm数据文件(slices)。可以使用 python的dicom包读取,读取示例代码如下:

    dicom.read_file('/data/lung_competition/stage1/7050f8141e92fa42fd9c471a8b2f50ce/498d16aa2222d76cae1da144ddc59a13.dcm')

    一般使用其pixl_array数据

    slices = [dicom.read_file(os.path.join(folder_name,filename)) for filename in os.listdir(folder_name)]
    slices = np.stack([s.pixel_array for s in slices])

    2.2 mhd格式

    mhd格式是另外一种数据格式,来源于(LUNA2016)[https://luna16.grand-challenge.org/data/]。每个病人一个mhd文件和一个同名的raw文件。如下:

    这里写图片描述

    一个mhd通常有几百兆,对应的raw文件只有1kb。mhd文件需要借助python的SimpleITK包来处理。SimpleITK 示例代码如下:

    import SimpleITK as sitk
    itk_img = sitk.ReadImage(img_file) 
    img_array = sitk.GetArrayFromImage(itk_img) # indexes are z,y,x (notice the ordering)
    num_z, height, width = img_array.shape        #heightXwidth constitute the transverse plane
    origin = np.array(itk_img.GetOrigin())      # x,y,z  Origin in world coordinates (mm)
    spacing = np.array(itk_img.GetSpacing())    # spacing of voxels in world coor. (mm)

    需要注意的是,SimpleITK的img_array的数组不是直接的像素值,而是相对于CT扫描中原点位置的差值,需要做进一步转换。转换步骤参考 SimpleITK图像转换

    2.3 查看CT扫描文件软件

    一个开源免费的查看软件 mango
    这里写图片描述

    三 dicom格式数据处理过程

    3.1 处理思路

    首先,需要明白的是医学扫描图像(scan)其实是三维图像,使用代码读取之后开源查看不同的切面的切片(slices),可以从不同轴切割

    这里写图片描述

    如下图展示了一个病人CT扫描图中,其中部分切片slices

    这里写图片描述

    其次,CT扫描图是包含了所有组织的,如果直接去看,看不到任何有用信息。需要做一些预处理,预处理中一个重要的概念是放射剂量,衡量单位为HU(Hounsfield Unit),下表是不同放射剂量对应的组织器官

    这里写图片描述

    Hounsfield Unit = pixel_value * rescale_slope + rescale_intercept

    一般情况rescale slope = 1, intercept = -1024。
    灰度值是pixel value经过重重LUT转换得到的用来进行显示的值,而这个转换过程是不可逆的,也就是说,灰度值无法转换为ct值。只能根据窗宽窗位得到一个大概的范围。 pixel value经过modality lut得到Hu,但是怀疑pixelvalue的读取出了问题。dicom文件中存在(0028,0106)(0028,0107)两个tag,分别是最大最小pixel value,可以用来检验你读取的pixel value 矩阵是否正确。
    LUT全称look up table,实际上就是一张像素灰度值的映射表,它将实际采样到的像素灰度值经过一定的变换如阈值、反转、二值化、对比度调整、线性变换等,变成了另外一 个与之对应的灰度值,这样可以起到突出图像的有用信息,增强图像的光对比度的作用。
    首先去除超过 -2000的pixl_array,CT扫描边界之外的像素值固定为-2000(dicom和mhd都是这个值)。第一步是设定这些值为0,当前对应为空气(值为0)

    slices[slices == -2000] = 0

    上表中肺部组织的HU数值为-500,但通常是大于这个值,比如-320、-400。挑选出这些区域,然后做其他变换抽取出肺部像素点。抽取出这些特征,最后将其存储为ndarray的npy格式,供给卷积神经网络。

    3.2 先载入必要的包

    # -*- coding:utf-8 -*-
    '''
    this script is used for basic process of lung 2017 in Data Science Bowl
    '''
    
    import glob
    import os
    import pandas as pd
    import SimpleITK as sitk
    
    import numpy as np # linear algebra
    import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
    import skimage, os
    from skimage.morphology import ball, disk, dilation, binary_erosion, remove_small_objects, erosion, closing, reconstruction, binary_closing
    from skimage.measure import label,regionprops, perimeter
    from skimage.morphology import binary_dilation, binary_opening
    from skimage.filters import roberts, sobel
    from skimage import measure, feature
    from skimage.segmentation import clear_border
    from skimage import data
    from scipy import ndimage as ndi
    import matplotlib
    #matplotlib.use('Agg')
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d.art3d import Poly3DCollection
    import dicom
    import scipy.misc
    import numpy as np

    DICOM是医学图像中标准文件,这些文件包含了诸多的
    元数据信息(比如像素尺寸,每个维度的一像素代表真实世界里的长度)。如下代码是载入一个扫描面,包含了多个切片(slices),我们仅简化的将其存储为python列表。数据集中每个目录都是一个扫描面集(一个病人)。有个元数据域丢失,即Z轴方向上的像素尺寸,也即切片的厚度 。所幸,我们可以用其他值推测出来,并加入到元数据中。

    # Load the scans in given folder path
    def load_scan(path):
        slices = [dicom.read_file(path + '/' + s) for s in os.listdir(path)]
        slices.sort(key = lambda x: int(x.ImagePositionPatient[2]))
        try:
            slice_thickness = np.abs(slices[0].ImagePositionPatient[2] - slices[1].ImagePositionPatient[2])
        except:
            slice_thickness = np.abs(slices[0].SliceLocation - slices[1].SliceLocation)
    
        for s in slices:
            s.SliceThickness = slice_thickness
    
        return slices

    3.3 像素转换为HU单元

    有些扫描面有圆柱形扫描边界,但是输出图像是正方形。边界之外的像素值固定为-2000,。第一步是设定这些值为0,当前对应为空气(值为0)。然后回到HU单元,乘以rescale比率并加上intercept(存储在扫描面的元数据中)。

    def get_pixels_hu(slices):
        image = np.stack([s.pixel_array for s in slices])
        # Convert to int16 (from sometimes int16), 
        # should be possible as values should always be low enough (<32k)
        image = image.astype(np.int16)
        # Set outside-of-scan pixels to 0
        # The intercept is usually -1024, so air is approximately 0
        image[image == -2000] = 0
    
    
    # Convert to Hounsfield units (HU)
        for slice_number in range(len(slices)):
    
            intercept = slices[slice_number].RescaleIntercept
            slope = slices[slice_number].RescaleSlope
    
            if slope != 1:
                image[slice_number] = slope * image[slice_number].astype(np.float64)
                image[slice_number] = image[slice_number].astype(np.int16)
    
            image[slice_number] += np.int16(intercept)
    
        return np.array(image, dtype=np.int16)

    可以查看病人的扫描HU值分布情况

    first_patient = load_scan(INPUT_FOLDER + patients[0])
    first_patient_pixels = get_pixels_hu(first_patient)
    plt.hist(first_patient_pixels.flatten(), bins=80, color='c')
    plt.xlabel("Hounsfield Units (HU)")
    plt.ylabel("Frequency")
    plt.show()

    这里写图片描述

    3.4重新采样

    不同扫描面的像素尺寸、粗细粒度是不同的。这不利于我们进行CNN任务,我们可以使用同构采样。
    一个扫描面的像素区间可能是[2.5,0.5,0.5],即切片之间的距离为2.5mm。可能另外一个扫描面的范围是[1.5,0.725,0.725]。这可能不利于自动分析。
    常见的处理方法是从全数据集中以固定的同构分辨率重新采样。如果我们选择,将所有的东西采样为1mmx1mmx1mm像素,我们可以使用3D卷积网络

    def resample(image, scan, new_spacing=[1,1,1]):
        # Determine current pixel spacing
        spacing = map(float, ([scan[0].SliceThickness] + scan[0].PixelSpacing))
        spacing = np.array(list(spacing))
        resize_factor = spacing / new_spacing
        new_real_shape = image.shape * resize_factor
        new_shape = np.round(new_real_shape)
        real_resize_factor = new_shape / image.shape
        new_spacing = spacing / real_resize_factor
    
        image = scipy.ndimage.interpolation.zoom(image, real_resize_factor, mode='nearest')
    
        return image, new_spacing

    现在重新取样病人的像素,将其映射到一个同构分辨率 1mm x1mm x1mm。

    pix_resampled, spacing = resample(first_patient_pixels, first_patient, [1,1,1])

    输出肺部扫描的3D图像方法

    def plot_3d(image, threshold=-300):
    
        # Position the scan upright, 
        # so the head of the patient would be at the top facing the camera
        p = image.transpose(2,1,0)
    
        verts, faces = measure.marching_cubes(p, threshold)
        fig = plt.figure(figsize=(10, 10))
        ax = fig.add_subplot(111, projection='3d')
        # Fancy indexing: `verts[faces]` to generate a collection of triangles
        mesh = Poly3DCollection(verts[faces], alpha=0.1)
        face_color = [0.5, 0.5, 1]
        mesh.set_facecolor(face_color)
        ax.add_collection3d(mesh)
        ax.set_xlim(0, p.shape[0])
        ax.set_ylim(0, p.shape[1])
        ax.set_zlim(0, p.shape[2])
        plt.show()

    打印函数有个阈值参数,来打印特定的结构,比如tissue或者骨头。400是一个仅仅打印骨头的阈值(HU对照表)

    plot_3d(pix_resampled, 400)

    这里写图片描述

    3.5 输出一个病人scans中所有切面slices

    def plot_ct_scan(scan):
        '''
                plot a few more images of the slices
        :param scan:
        :return:
        '''
        f, plots = plt.subplots(int(scan.shape[0] / 20) + 1, 4, figsize=(50, 50))
        for i in range(0, scan.shape[0], 5):
            plots[int(i / 20), int((i % 20) / 5)].axis('off')
            plots[int(i / 20), int((i % 20) / 5)].imshow(scan[i], cmap=plt.cm.bone)

    此方法的效果示例如下:

    这里写图片描述

    3.6 定义分割出CT切面里面肺部组织的函数

    def get_segmented_lungs(im, plot=False):
    
        '''
        This funtion segments the lungs from the given 2D slice.
        '''
        if plot == True:
            f, plots = plt.subplots(8, 1, figsize=(5, 40))
        '''
        Step 1: Convert into a binary image.
        '''
        binary = im < 604
        if plot == True:
            plots[0].axis('off')
            plots[0].set_title('binary image')
            plots[0].imshow(binary, cmap=plt.cm.bone)
    
        '''
        Step 2: Remove the blobs connected to the border of the image.
        '''
        cleared = clear_border(binary)
        if plot == True:
            plots[1].axis('off')
            plots[1].set_title('after clear border')
            plots[1].imshow(cleared, cmap=plt.cm.bone)
    
        '''
        Step 3: Label the image.
        '''
        label_image = label(cleared)
        if plot == True:
            plots[2].axis('off')
            plots[2].set_title('found all connective graph')
            plots[2].imshow(label_image, cmap=plt.cm.bone)
        '''
        Step 4: Keep the labels with 2 largest areas.
        '''
        areas = [r.area for r in regionprops(label_image)]
        areas.sort()
        if len(areas) > 2:
            for region in regionprops(label_image):
                if region.area < areas[-2]:
                    for coordinates in region.coords:
                           label_image[coordinates[0], coordinates[1]] = 0
        binary = label_image > 0
        if plot == True:
            plots[3].axis('off')
            plots[3].set_title(' Keep the labels with 2 largest areas')
            plots[3].imshow(binary, cmap=plt.cm.bone)
        '''
        Step 5: Erosion operation with a disk of radius 2. This operation is
        seperate the lung nodules attached to the blood vessels.
        '''
        selem = disk(2)
        binary = binary_erosion(binary, selem)
        if plot == True:
            plots[4].axis('off')
            plots[4].set_title('seperate the lung nodules attached to the blood vessels')
            plots[4].imshow(binary, cmap=plt.cm.bone)
        '''
        Step 6: Closure operation with a disk of radius 10. This operation is
        to keep nodules attached to the lung wall.
        '''
        selem = disk(10)
        binary = binary_closing(binary, selem)
        if plot == True:
            plots[5].axis('off')
            plots[5].set_title('keep nodules attached to the lung wall')
            plots[5].imshow(binary, cmap=plt.cm.bone)
        '''
        Step 7: Fill in the small holes inside the binary mask of lungs.
        '''
        edges = roberts(binary)
        binary = ndi.binary_fill_holes(edges)
        if plot == True:
            plots[6].axis('off')
            plots[6].set_title('Fill in the small holes inside the binary mask of lungs')
            plots[6].imshow(binary, cmap=plt.cm.bone)
        '''
        Step 8: Superimpose the binary mask on the input image.
        '''
        get_high_vals = binary == 0
        im[get_high_vals] = 0
        if plot == True:
            plots[7].axis('off')
            plots[7].set_title('Superimpose the binary mask on the input image')
            plots[7].imshow(im, cmap=plt.cm.bone)
    
        return im

    此方法每个步骤对图像做不同的处理,效果如下:

    这里写图片描述

    3.7 肺部图像分割

    为了减少有问题的空间,我们可以分割肺部图像(有时候是附近的组织)。这包含一些步骤,包括区域增长和形态运算,此时,我们只分析相连组件。
    步骤如下:

    • 阈值图像(-320HU是个极佳的阈值,但是此方法中不是必要)
    • 处理相连的组件,以决定当前患者的空气的标签,以1填充这些二值图像
    • 可选:当前扫描的每个轴上的切片,选定最大固态连接的组织(当前患者的肉体和空气),并且其他的为0。以掩码的方式填充肺部结构。
    • 只保留最大的气袋(人类躯体内到处都有气袋)
    def largest_label_volume(im, bg=-1):
        vals, counts = np.unique(im, return_counts=True)
        counts = counts[vals != bg]
        vals = vals[vals != bg]
        if len(counts) > 0:
            return vals[np.argmax(counts)]
        else:
            return None
    def segment_lung_mask(image, fill_lung_structures=True):
    
        # not actually binary, but 1 and 2. 
        # 0 is treated as background, which we do not want
        binary_image = np.array(image > -320, dtype=np.int8)+1
        labels = measure.label(binary_image)
    
        # Pick the pixel in the very corner to determine which label is air.
        #   Improvement: Pick multiple background labels from around the patient
        #   More resistant to "trays" on which the patient lays cutting the air 
        #   around the person in half
        background_label = labels[0,0,0]
    
        #Fill the air around the person
        binary_image[background_label == labels] = 2
    
    
        # Method of filling the lung structures (that is superior to something like 
        # morphological closing)
        if fill_lung_structures:
            # For every slice we determine the largest solid structure
            for i, axial_slice in enumerate(binary_image):
                axial_slice = axial_slice - 1
                labeling = measure.label(axial_slice)
                l_max = largest_label_volume(labeling, bg=0)
    
                if l_max is not None: #This slice contains some lung
                    binary_image[i][labeling != l_max] = 1
    
        binary_image -= 1 #Make the image actual binary
        binary_image = 1-binary_image # Invert it, lungs are now 1
    
        # Remove other air pockets insided body
        labels = measure.label(binary_image, background=0)
        l_max = largest_label_volume(labels, bg=0)
        if l_max is not None: # There are air pockets
            binary_image[labels != l_max] = 0
    
        return binary_image

    查看切割效果

    segmented_lungs = segment_lung_mask(pix_resampled, False)
    segmented_lungs_fill = segment_lung_mask(pix_resampled, True)
    plot_3d(segmented_lungs, 0)

    这里写图片描述

    我们可以将肺内的结构也包含进来(结节是固体),不仅仅只是肺部内的空气

    plot_3d(segmented_lungs_fill, 0)

    这里写图片描述

    使用掩码时,要注意首先进行形态扩充(python的skimage的skimage.morphology)操作(即使用圆形kernel,结节是球体),参考 python形态操作。这会在所有方向(维度)上扩充掩码。仅仅肺部的空气+结构将不会包含所有结节,事实上有可能遗漏黏在肺部一侧的结节(这会经常出现,所以建议最好是扩充掩码)。

    3.8 数据预处理

    归一化处理
    当前的值范围是[-1024,2000]。任意大于400的值都是我们所感兴趣的,因为它们都是不同反射密度下的骨头。LUNA16竞赛中常用来做归一化处理的阈值集是-1000和400.以下代码

    #归一化
    MIN_BOUND = -1000.0
    MAX_BOUND = 400.0
    
    def normalize(image):
        image = (image - MIN_BOUND) / (MAX_BOUND - MIN_BOUND)
        image[image>1] = 1.
        image[image<0] = 0.
        return image

    0值中心化
    简单来说就是所有像素值减去均值。LUNA16竞赛中的均值大约是0.25.
    不要对每一张图像做零值中心化(此处像是在kernel中完成的)CT扫描器返回的是校准后的精确HU计量。不会出现普通图像中会出现某些图像低对比度和明亮度的情况

    PIXEL_MEAN = 0.25
    
    def zero_center(image):
        image = image - PIXEL_MEAN
        return image
    

    3.9 存储每个病人scan的所有slice肺部特征

    下述代码为main函数中整体过程

     lung_head_dir = '/data/lung_competition/stage1/'
        img_save_head = '/data/lung_competition/roi_images/'
        patient_scans_list = [x for x in os.listdir(lung_head_dir) if os.path.isdir(os.path.join(lung_head_dir,x))]
        #patient_labels_file = '/data/lung_competition/stage1_labels.csv'
        #patient_labels = pd.read_csv(patient_labels_file)
        selem = ball(2)
        #print(patient_scans_list)
        for scan in patient_scans_list:
            scan_files = os.path.join(lung_head_dir,scan)
            ct_scan = read_ct_scan(scan_files)
            save_npy_path = os.path.join(img_save_head, scan)
            if os.path.exists(save_npy_path):
                os.mkdir(save_npy_path)

    存储病人scan的所有slice肺部特征的关键代码为

    segmented_ct_scan = segment_lung_from_ct_scan(ct_scan)
    save_npy = save_npy_path+'.npy'
    np.save(save_npy,segmented_ct_scan)
    print('file %s saved ..'%save_npy)
    plot_ct_scan(segmented_ct_scan)

    四 mhd格式数据处理过程

    4.1 处理思路

    mhd的数据只是格式与dicom不一样,其实质包含的都是病人扫描。处理MHD需要借助SimpleIKT这个包,处理思路详情可以参考Data Science Bowl2017的toturail Data Science Bowl 2017。需要注意的是MHD格式的数据没有HU值,它的值域范围与dicom很不同。
    我们以LUNA2016年的数据处理流程为例。参考代码为 LUNA2016数据切割

    4.2 载入必要的包

    import SimpleITK as sitk
    import numpy as np
    import csv
    from glob import glob
    import pandas as pd
    file_list=glob(luna_subset_path+"*.mhd")
    #####################
    #
    # Helper function to get rows in data frame associated 
    # with each file
    def get_filename(case):
        global file_list
        for f in file_list:
            if case in f:
                return(f)
    #
    # The locations of the nodes
    df_node = pd.read_csv(luna_path+"annotations.csv")
    df_node["file"] = df_node["seriesuid"].apply(get_filename)
    df_node = df_node.dropna()
    #####
    #
    # Looping over the image files
    #
    fcount = 0
    for img_file in file_list:
        print "Getting mask for image file %s" % img_file.replace(luna_subset_path,"")
        mini_df = df_node[df_node["file"]==img_file] #get all nodules associate with file
        if len(mini_df)>0:       # some files may not have a nodule--skipping those 
            biggest_node = np.argsort(mini_df["diameter_mm"].values)[-1]   # just using the biggest node
            node_x = mini_df["coordX"].values[biggest_node]
            node_y = mini_df["coordY"].values[biggest_node]
            node_z = mini_df["coordZ"].values[biggest_node]
            diam = mini_df["diameter_mm"].values[biggest_node]

    4.3 LUNA16的MHD格式数据的值

    一直在寻找MHD格式数据的处理方法,对于dicom格式的CT有很多论文根据其HU值域可以轻易地分割肺、骨头、血液等,但是对于MHD没有这样的参考。从LUNA16论坛得到的解释是,LUNA16的MHD数据已经转换为HU值了,不需要再使用slope和intercept来做rescale变换了。此论坛主题下,有人提出MHD格式没有提供pixel spacing(mm) 和 slice thickness(mm) ,而标准文件annotation.csv文件中结节的半径和坐标都是mm单位,最后确认的是MHD格式文件中只保留了体素尺寸以及坐标原点位置,没有保存slice thickness。如此来说,dicom才是原始数据格式。

    4.4 坐标体系变换

    MHD值得坐标体系是体素,以mm为单位。结节的位置是CT scanner坐标轴里面相对原点的mm值,需要将其转换到真实坐标轴位置,可以使用SimpleITK包中的 GetOrigin() GetSpacing()。图像数据是以512x512数组的形式给出的。
    坐标变换如

    这里写图片描述

    相应的代码处理如下:

    k_img = sitk.ReadImage(img_file) 
    img_array = sitk.GetArrayFromImage(itk_img) # indexes are z,y,x (notice the ordering)
    center = np.array([node_x,node_y,node_z])   # nodule center
    origin = np.array(itk_img.GetOrigin())      # x,y,z  Origin in world coordinates (mm)
    spacing = np.array(itk_img.GetSpacing())    # spacing of voxels in world coor. (mm)
    v_center =np.rint((center-origin)/spacing)  # nodule center in voxel space (still x,y,z ordering)
    

    在LUNA16的标注CSV文件中标注了结节中心的X,Y,Z轴坐标,但是实际取值的时候取的是Z轴最后三层的数组(img_array)。
    下述代码只提取了包含结节的最后三个slice的数据

    i=0
    for i_z in range(int(v_center[2])-1,int(v_center[2])+2):
        mask = make_mask(center,diam,i_z*spacing[2]+origin[2],width,height,spacing,origin)
        masks[i] = mask
        imgs[i] = matrix2int16(img_array[i_z])
        i+=1
    np.save(output_path+"images_%d.npy" % (fcount) ,imgs)
    np.save(output_path+"masks_%d.npy" % (fcount) ,masks)

    4.5 查看结节

    以下代码用于查看原始CT和结mask

    import matplotlib.pyplot as plt
    imgs = np.load(output_path+'images_0.npy')
    masks = np.load(output_path+'masks_0.npy')
    for i in range(len(imgs)):
        print "image %d" % i
        fig,ax = plt.subplots(2,2,figsize=[8,8])
        ax[0,0].imshow(imgs[i],cmap='gray')
        ax[0,1].imshow(masks[i],cmap='gray')
        ax[1,0].imshow(imgs[i]*masks[i],cmap='gray')
        plt.show()
        raw_input("hit enter to cont : ")

    这里写图片描述

    4.6 包含结节位置信息的mhd格式数据特征

    参考一个开源代码实现 UNET训练肺组织结节分割

    展开全文
  • 什么是数字图像处理?历史、以及它所研究的内容。 说起图像处理,你会想到什么?你是否真的了解这个领域所研究的内容。纵向来说,数字图像处理研究的历史相当悠久;横向来说,数字图像处理研究的话题相当广泛。 ...

    什么是数字图像处理?历史、以及它所研究的内容。

     

    说起图像处理,你会想到什么?你是否真的了解这个领域所研究的内容。纵向来说,数字图像处理研究的历史相当悠久;横向来说,数字图像处理研究的话题相当广泛。

    数字图像处理的历史可以追溯到近百年以前,大约在1920年的时候,图像首次通过海底电缆从英国伦敦传送到美国纽约。图像处理的首次应用是为了改善伦敦和纽约之间海底电缆发送的图片质量,那时就应用了图像编码,被编码后的图像通过海底电缆传送至目的地,再通过特殊设备进行输出。这是一次历史性的进步,传送一幅图片的时间从原来的一个多星期减少到了3小时。

    1950年,美国的麻省理工学院制造出了第一台配有图形显示器的电子计算机——旋风I号(Whirlwind I)。旋风I号的显示器使用一个类似于示波器的阴极射线管(Cathode Ray Tube,CRT)来显示一些简单的图形。1958年美国Calcomp公司研制出了滚筒式绘图仪,GerBer公司把数控机床发展成为平板式绘图仪。在这一时期,电子计算机都主要应用于科学计算,而为这些计算机配置的图形设备也仅仅是作为一种简单的输出设备。

    随着计算机技术的进步,数字图像处理技术也得到了很大的发展。1962年,当时还在麻省理工学院攻读博士学位的伊凡·苏泽兰(Ivan Sutherland)成功开发了具有划时代意义的“画板”(Sketchpad)程式。而这正是有史以来第一个交互式绘图系统,同时这也是交互式电脑绘图的开端。从此计算机和图形图像被更加紧密地联系到了一起。鉴于伊凡·苏泽兰为计算机图形学创立所做出的杰出贡献,他于1988年被授予计算机领域最高奖——图灵奖。

    1964年,美国加利福尼亚的喷气推进实验室用计算机对“旅行者七号”太空船发回的大批月球照片进行处理,以校正航天器上摄影机中各种类型的图像畸变,收到了明显的效果。在后来的宇航空间技术中,数字图像处理技术都发挥了巨大的作用。

    到了20世纪60年代末期,数字图像处理已经形成了比较完善的学科体系,这套理论在20世纪70年代发展得十分迅速,并开始应用于医学影像和天文学等领域。1972年,美国物理学家阿伦·马克利奥德·柯麦科(Allan MacLeodCormack)和英国电机工程师戈弗雷·纽博尔德·豪恩斯弗尔德(Godfrey Newbold Housfield)发明了轴向断层术,并将其用于头颅诊断。世界第一台X射线计算机轴向断层摄影装置由EMI公司研制成功,这也就是人们通常所说的CT(Computer Tomograph)。CT可通过一些算法用感知到的数据去重建通过物体的“切片”图像。这些图像组成了物体内部的再现图像,也就是根据人的头部截面的投影,经计算机处理来进行图像重建。鉴于CT对于医学诊断技术的发展所起到的巨大推动作用,柯麦科和豪恩斯弗尔德于1979年获得了诺贝尔生理或医学奖。

    随后在2003年,诺贝尔生理或医学奖的殊荣再次授予了两位在医疗影像设备研究方面做出杰出贡献的科学家——美国化学家保罗·劳特伯尔(Paul Lauterbur)和英国物理学家彼得·曼斯菲尔(Peter Mansfield)。两位获奖者在利用磁共振成像(Magnetic Resonance Imaging,MRI)显示不同结构方面分别取得了开创性成就。瑞典卡罗林斯卡医学院称,这两位科学家在MRI领域的开创性工作,代表了医学诊疗和研究的重大突破。而事实上,核磁共振的成功同样也离不开数字图像处理方面的发展。即使在今天,诸如MRI图像降噪等问题依然是数字图像处理领域的热门研究方向。

    说到数字图像的发展历程,还有一项至关重要的成果不得不提,那就是电荷耦合元件(Charge-coupled Device,CCD)。CCD最初是由美国贝尔实验室的科学家维拉德·波义耳(Willard Sterling Boyle)和乔治·史密斯(George Elwood Smith)于1969年发明的。CCD的作用就像胶片一样,它能够把光学影像转化为数字信号。今天人们所广泛使用的数码照相机、数码摄影机和扫描仪都是以CCD为基础发展而来的。换句话说,我们现在所研究的数字图像主要也都是通过CCD设备获取的。由于波义耳和史密斯在CCD研发上所做出的巨大贡献,他们两人共同荣获了2009年度的诺贝尔物理学奖。

    数字图像处理在今天是非常热门的技术之一,生活中无处不存在着它的影子,可以说它是一种每时每刻都在改变着人类生活的技术。但长久以来,很多人对数字图像处理存在着较大的曲解,人们总是不自觉地将图像处理和Photoshop联系在一起。大名鼎鼎的Photoshop无疑是当前使用最为广泛的图像处理工具。类似的软件还有Corel公司生产的CorelDRAW等软件。

    尽管Photoshop是一款非常优秀的图像处理软件,但它的存在并不代表数字图像处理的全部理论与方法。它所具有的功能仅仅是数字图像处理中的一部分。总的来说,数字图像处理研究的内容主要包括如下几个方面:

    • 1)图像获取和输出
    • 2)图像编码和压缩
    • 3)图像增强与复原
    • 4)图像的频域变换
    • 5)图像的信息安全
    • 6)图像的区域分割
    • 7)图像目标的识别
    • 8)图像的几何变换

    但图像处理的研究内容,又不仅限于上述内容!所以说图像处理的研究话题是相当宽泛的。那现在图像处理都应用在哪些领域呢?或许我们可能熟知的例子有(当然,你应该还能举出更多例子):

    • 1)一些专业图像处理软件:Photoshop、CorelDRAW……
    • 2)一些手机APP应用:美图秀秀、玩图……
    • 3)一些医学图像处理应用:MRI、彩超图像处理……
    • 4)一些制造业上的应用:元器件检测、瑕疵检测……
    • 5)一些摄像头、相机上的应用:夜间照片的质量改善……
    • 6)一些电影工业上是应用:换背景、电影特技……

     

    什么样的人会去学(或者需要学)图像处理?

     

    1)如果你是我上述那些应用领域的从业者,你当然需要掌握图像方面的理论和技术;2)相关专业的研究人员、大专院校的博士生、研究生。

    所谓相关专业又是指什么呢?这个答案也可能相当宽泛,例如(但不仅限于此):Computer Science, Software Engineering, Electronic Engineering, Biomedical Engineering, Automation, Control, Applied Mathematics……

     

    如何学好图像处理——我的一些箴言

     

    1)对于初级入门者

     

    一个扎实的基础和对于图像处理理论的完整的、系统的整体认识对于后续的深入研究和实践应用具有非常非常重要的意义。

    我经常喜欢拿武侠小说《天龙八部》中的一段情节来向读者说明此中的道理,相信读者对这部曾经被多次搬上银幕的金庸作品已经耳熟能详了。书中讲到有个名叫鸠摩智的番僧一心想练就绝世武学,而且他也算是个相当勤奋的人了。但是,他错就错在太过于急功近利,甚至使用道家的小无相功来催动少林绝技。看上去威力无比,而且可以在短时间内“速成”,但实则后患无穷。最终鸠摩智走火入魔,前功尽废,方才大彻大悟。这个故事其实就告诉我们打牢基础是非常重要的,特别是要取得更长足的发展,就更是要对基本原理刨根问底,力求甚解,从而做到庖丁解牛,游刃有余。

    一些看似高深的算法往往是许多基础算法的组合提升。例如,令很多人望而却步的SIFT特征构建过程中,就用到了图像金字塔、直方图、高斯滤波这些非常非常基础的内容。但是,它所涉及的基础技术显然有好几个,如果缺乏对图像处理理论的系统认识,你可能会感觉事倍功半。因为所有的地方好像都是沟沟坎坎。

    关于课程——

    在这个阶段其实对于数学的要求并不高,你甚至可以从一些感性的角度去形象化的理解图像处理中很多内容(但不包括频域处理方面的内容)。具体到学习的建议,如果有条件(例如你还在高校里读书)你最好能选一门图像处理方面的课程,系统地完整的地去学习一下。这显然是入门的最好办法。如此一来,在建立一个完整的、系统的认知上相当有帮助。如果你没办法在学校里上一门这样的课,网上的一些公开课也可以试试。但现在中文MOOC上还没有这方面的优质课程推荐。英文的课程则有很多,例如美国加州伦斯勒理工学院Rich教授的数字图像处理公开课——https://www.youtube.com/channel/UCaiJlKxXamoODQtlx486qJA?spfreload=10。

    关于教材——

    显然,只听课其实还不太够,如果能一并读一本书就最好了。其实不用参考很多书,只要一本,你能从头读到尾就很好了。如果你没有条件去上一门课,那读一本来完整的自学一下就更有必要了。这个阶段,去网上到处找博客、看帖子是不行的。因为你特别需要在这个阶段对这门学问建立一个系统的完整的知识体系。东一块、西一块的胡拼乱凑无疑是坑你自己,你的知识体系就像一个气泡,可能看起来很大,但是又脆弱的不堪一击。

    现在很多学校采用冈萨雷斯的《数字图像处理》一书作为教材。这是一本非常非常经典的著作。但是我必须要提醒读者:

    1)这是一本专门为Electronic Engineering专业学生所写的书。它需要有信号与系统、数字信号处理这两门课作为基础。如果你没有这两门课的基础,你读这本书要么是看热闹,要么就是看不懂。

    下面是冈书中的一张插图。对于EE的学生来说,这当然不是问题。但是如果没有我说的那两门课的基础,其实你很难把握其中的精髓。H和h,一个大小一个小写,冈书中有的地方用H,有的地方用h,这都是有很深刻用意的。原作者并没有特别说明它们二者的区别,因为他已经默认你应该知道二者是不同的。事实上,它们一个表示频域信号,一个表示时域信号,这也导致有时候运算是卷积,有时候运算是乘法(当然这跟卷积定理有关)。所以我并不太建议那些没有这方面基础的学生在自学的时候读这本书。

     

    2)冈萨雷斯教授的《数字图像处理》第一版是在1977年出版的,到现在已经快40年了;现在国内广泛使用的第二版是2002年出版的(第三版是2007年但是其实二者差异并不大),到现在也有20年左右的时间了。事实上,冈萨雷斯教授退休也有快30年了。所以这本书的内容已经偏于陈旧。数字图像处理这个领域的发展绝对是日新月异,突飞猛进的。特别在最近二三十年里,很多新思路,新方法不断涌现。如果你看了我前面推荐的Rich教授的公开课(这也是当前美国大学正在教学的内容),你一下子就会发现,原来我们的教育还停留在改革开放之前外国的水平上。这其实特别可怕。所以我觉得冈萨雷斯教授的《数字图像处理》作为学习过程中的一个补充还是不错的,但是如果把它作为主参考,那真的就是:国外都洋枪洋炮了,我们还在大刀长矛。

     

    那么现在问题来了,对于图像处理学习者而言到底看什么书好呢?我的意见是你可以选择下面两本书中的任何一本《数字图像处理原理与实践(Matlab版)》,以及《数字图像处理:技术详解与Visual C++实践》,当然选择的标准之一就是到底你更擅长使用MATLAB还是C++。

       

     

     

     

    2)对于中级水平者

     

    纸上得来终觉浅,绝知此事要躬行。对于一个具有一定基础的,想更进一步的中级水平的人来说,这个阶段最重要的就是增强动手实践的能力。

    还是说《天龙八部》里面的一个角色——口述武功、叹为观止的王语嫣。王语嫣的脑袋里都是武功秘籍,但问题是她从来都没练过一招一式。结果是,然并卵。所以光说不练肯定不灵啊。特别是,如果你将来想从事这个行业,结果一点代码都不会写,那几乎是不可想象的。学习阶段,最常被用来进行算法开发的工具是Matlab和OpenCV。你可以把这两个东西都理解为一个相当完善的库。当然,在工业中C++用得更多,所以Matlab的应用还是很有限的。前面我们讲到,图像处理研究内容其实包括:图像的获取和编解码,但使用Matlab和OpenCV就会掩盖这部分内容的细节。你当然永远不会知道,JPEG文件到底是如何被解码的。

    如果你的应用永远都不会涉及这些话题,那么你一直用Matlab和OpenCV当然无所谓。例如你的研究领域是SIFT、SURF这种特征匹配,可以不必理会编解码方面的内容。但是如果你的研究话题是降噪或者压缩,可能你就绕不开这些内容。最开始学的时候,如果能把这部分内容也自己写写,可能会加深你的理解。以后做高级应用开发时,再调用那些库。所以具体用什么,要不要自己写,是要视你所处的阶段和自己的实际情况而定的。以我个人的经验,在我自学的时候,我就动手写了Magic House,我觉得这个过程为我奠定了一个非常夯实的基础,对于我后续的深入研究很有帮助。

     

    下面这个文中,我给出了一些这方面的资源,代码多多,很值得参考学习:图像处理与机器视觉网络资源收罗

    http://blog.csdn.net/baimafujinji/article/details/32332079

     

    3)对于高级进阶者

     

    到了这个程度的读者,编程实现之类的基本功应该不在话下。但是要往深,往高去学习、研究和开发图像处理应用,你最需要的内容就变成了数学。这个是拦在很多处于这个阶段的人面前的一大难题。如果你的专业是应用数学,当然你不会感觉有问题。但如果是其他专业背景的人就会越发感觉痛苦。

    如果你的图像处理是不涉及机器学习内容的,例如用Poisson方程来做图像融合,那你就要有PDE数值解方面的知识;如果你要研究KAZE特征,你就必须要知道AOS方面的内容。如果你研究TV降噪,你又要知道泛函分析中的BV空间内容……这些词你可能很多都没听过。总的来说,这块需要的内容包括:复变函数、泛函分析、偏微分方程、变分法、数学物理方法……

    如果你要涉足机器视觉方法的内容,一些机器学习和数据挖掘方法的内容就不可或缺。而这部分内容同样需要很强大的数学基础,例如最大似然方法、梯度下降法、欧拉-拉格朗日方程、最小二乘估计、凸函数与詹森不等式……

    当然,走到这一步,你也已经脱胎换骨,从小白到大神啦!路漫漫其修远兮,吾将上下而求索。

     

    (全文完)

     

     

    展开全文
  • 图像处理之常见二值化方法汇总 图像二值化是图像分析与处理中最常见最重要的处理手段,二值处理方法也非常多。越 精准的方法计算量也越大。本文主要介绍四种常见的二值处理方法,通常情况下可以满 足大多数图像处理...

    图像处理之常见二值化方法汇总

    图像二值化是图像分析与处理中最常见最重要的处理手段,二值处理方法也非常多。越

    精准的方法计算量也越大。本文主要介绍四种常见的二值处理方法,通常情况下可以满

    足大多数图像处理的需要。主要本文讨论的方法仅针对RGB色彩空间。

     

    方法一:

    该方法非常简单,对RGB彩色图像灰度化以后,扫描图像的每个像素值,值小于127的

    像素值设为0(黑色),值大于等于127的像素值设为255(白色)。该方法的好处是计算

    量少速度快。缺点更多首先阈值为127没有任何理由可以解释,其次完全不考虑图像的

    像素分布情况与像素值特征。可以说该方法是史最弱智的二值处理方法一点也不为过。

     

    方法二:

    最常见的二值处理方法是计算像素的平均值K,扫描图像的每个像素值如像素值大于K

    像素值设为255(白色),值小于等于K像素值设为0(黑色)。该方法相比方法一,阈值的

    选取稍微有点智商,可以解释。但是使用平均值作为二值化阈值同样有个致命的缺点,

    可能导致部分对象像素或者背景像素丢失。二值化结果不能真实反映源图像信息。

     

    方法三:

    使用直方图方法来寻找二值化阈值,直方图是图像的重要特质,直方图方法选择二值

    化阈值主要是发现图像的两个最高的峰,然后在阈值取值在两个峰之间的峰谷最低处。

    该方法相对前面两种方法而言稍微精准一点点。结果也更让人可以接受。

     

    方法四:http://en.wikipedia.org/wiki/Thresholding_(image_processing)

    使用近似一维Means方法寻找二值化阈值,该方法的大致步骤如下:

    1.      一个初始化阈值T,可以自己设置或者根据随机方法生成。

    2.      根据阈值图每个像素数据P(n,m)分为对象像素数据G1与背景像素数据G2。(n为

    行,m为列)

    3.      G1的平均值是m1, G2的平均值是m2

    4.      一个新的阈值T’ = (m1 + m2)/2

    5.      回到第二步,用新的阈值继续分像素数据为对象与北京像素数据,继续2~4步,

    直到计算出来的新阈值等于上一次阈值。

    前面三种在以前的博文中都有涉及,最后一种二值化方法的代码如下:

    package com.gloomyfish.filter.study;
    
    import java.awt.image.BufferedImage;
    import java.util.ArrayList;
    import java.util.List;
    
    public class ThresholdBinaryFilter extends GrayFilter {
    
    	@Override
    	public BufferedImage filter(BufferedImage src, BufferedImage dest) {
    		int width = src.getWidth();
            int height = src.getHeight();
    
            if ( dest == null )
            	dest = createCompatibleDestImage( src, null );
    
            int[] inPixels = new int[width*height];
            int[] outPixels = new int[width*height];
            src = super.filter(src, null); // we need to create new one
            getRGB( src, 0, 0, width, height, inPixels );
            int index = 0;
            int means = getThreshold(inPixels, height, width);
            for(int row=0; row<height; row++) {
            	int ta = 0, tr = 0, tg = 0, tb = 0;
            	for(int col=0; col<width; col++) {
            		index = row * width + col;
            		ta = (inPixels[index] >> 24) & 0xff;
                    tr = (inPixels[index] >> 16) & 0xff;
                    tg = (inPixels[index] >> 8) & 0xff;
                    tb = inPixels[index] & 0xff;
                    if(tr > means) {
                    	tr = tg = tb = 255; //white
                    } else {
                    	tr = tg = tb = 0; // black
                    }
                    outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;
            	}
            }
            setRGB( dest, 0, 0, width, height, outPixels );
            return dest;
    	}
    
    	private int getThreshold(int[] inPixels, int height, int width) {
    		// maybe this value can reduce the calculation consume; 
    		int inithreshold = 127;
    		int finalthreshold = 0;
    		int temp[] = new int[inPixels.length];
    		for(int index=0; index<inPixels.length; index++) {
    			temp[index] = (inPixels[index] >> 16) & 0xff;
    		}
    		List<Integer> sub1 = new ArrayList<Integer>();
    		List<Integer> sub2 = new ArrayList<Integer>();
    		int means1 = 0, means2 = 0;
    		while(finalthreshold != inithreshold) {
    			finalthreshold = inithreshold;
    			for(int i=0; i<temp.length; i++) {
    				if(temp[i] <= inithreshold) {
    					sub1.add(temp[i]);
    				} else {
    					sub2.add(temp[i]);
    				}
    			}
    			means1 = getMeans(sub1);
    			means2 = getMeans(sub2);
    			sub1.clear();
    			sub2.clear();
    			inithreshold = (means1 + means2) / 2;
    		}
    		long start = System.currentTimeMillis();
    		System.out.println("Final threshold  = " + finalthreshold);
    		long endTime = System.currentTimeMillis() - start;
    		System.out.println("Time consumes : " + endTime);
    		return finalthreshold;
    	}
    
    	private static int getMeans(List<Integer> data) {
    		int result = 0;
    		int size = data.size();
    		for(Integer i : data) {
    			result += i;
    		}
    		return (result/size);
    	}
    
    }
    

    效果如下:


    学习视频教程 - 《数字图像处理-二值图像分析》

    展开全文
  • 在这个看脸的时代,颜值... 随着台式计算机的处理能力日益增强,各种图像拍摄的设备(例如平板电脑、手机摄像头、数码相机、扫描仪等)的普及,以及互联网的加持,使得数字图像处理变得与文字处理一样普及。本书就数字

    在这个看脸的时代,颜值就是一切。怎样可以成为控制颜值的“黑魔法师”?相信,阅读以下这些经典的图像处理书籍能够助你一臂之力。赶紧紧随大圣众包威客平台的脚步吧!

    1465571461-5092-2081_meitu_5.jpg

    1. 《数字图像处理基础》

    wKhQt1PWBqSEG-PpAAAAAI-EItA871_meitu_4.jpg

      随着台式计算机的处理能力日益增强,各种图像拍摄的设备(例如平板电脑、手机摄像头、数码相机、扫描仪等)的普及,以及互联网的加持,使得数字图像处理变得与文字处理一样普及。本书就数字图像处理的各个基本主题,先给出有关问题的数学公式,然后根据数学公式给出实现有关问题的伪代码,最后在Java语言及ImageJ平台下完整实现。《数字图像处理基础》作为高等学校计算机及相关专业“数字图像处理”课程的教材,是非常适合的。

      2.《数字图像处理(第三版)》

    wKhQt1PWBqSEG-PpAAAAAI-EItA871.jpg

      在数字图像处理领域,本书作为主要教材已有30多年。这一版本除保留了前两版的大部分内容外,作者更在13个方面对本书进行了修订,新增了400多幅图像、200多幅图表及80多道习题,融入了近年来数字图像处理领域的重要进展,因而本书特色鲜明且与时俱进。全书仍分为12章,即绪论、数字图像基础、灰度变换与空间滤波、频率域滤波、图像复原与重建、彩色图像处理、小波和多分辨率处理、图像压缩、形态学图像处理、图像分割、表示与描述、目标识别。

      3.《Image Processing and Analysis》

    368008126778492181.jpg

      《ImageProcessingandAnalysis》将现代数学与现代图像处理中最先进的方法联系起来,组织成一个连贯的逻辑结构。作者通过它们连接到傅里叶和光谱分析中的少数共同线程,揭示了传统图像处理的原理,从而整合了现代图像处理方法的多样性。可以说,这本书是全面而且综合的,它涵盖了当代图像分析和处理中的4个最强大的数学工具类,同时也探索了它们的内在连接和集成。

      4.《图像处理、分析与机器视觉(第3版)》

    42207392636698837.jpg

      《图像处理、分析与机器视觉(第3版)》是为计算机专业图像处理、图像分析和机器视觉课程编写的教材。此书针对这三方领域的有关原理与技术,展开了广泛而深入的讨论,包括图像预处理、图像分割、形状表示与描述、物体识别与图像理解、三维视觉、数学形态学图像处理技术、离散图像变换、图像压缩、纹理描述、运动分析等。本书力图将复杂的概念通过具体的示例以易于理解的算法来描述,并提供了大量包含图示和处理结果的插图,特别有助于读者的学习和理解。另外,它也覆盖了十分广泛的领域,包括人工智能、信号处理、人工神经网络、模式识别、机器学习、模糊数学等一系列相关学科,读者可以通过学习此书,学到很多具有普遍价值的知识和具体的应用方法。

      5.《数字图像处理与机器视觉》

    20140423104022124.jpg

      《数字图像处理与机器视觉》将理论知识、科学研究和工程实践有机结合起来,内容涉及数字图像处理和识别技术的方方面面,包括图像的点运算、几何变换、空域和频域滤波、小波变换、图像复原、彩色图像处理、形态学处理、图像分割、图像压缩以及图像特征提取等。本书也对机器视觉进行了前导性的探究,重点介绍了3种目前在工程技术领域非常流行的分类技术——人工神经网络(ANN)、支持向量机(SVM)和AdaBoost,并在配套给出的识别案例中直击光学字符识别(OCR)、人脸识别和性别分类等热点问题。《数字图像处理与机器视觉》结构紧凑,内容深入浅出,讲解图文并茂,适合于计算机、通信和自动化等相关专业的本科生、研究生,以及工作在图像处理和识别领域一线的广大工程技术人员阅读参考。

      6.《Mathematical Problems in Image Processing》

    14047023764241.jpg

      本书更新的第二版提供了各种图像分析的应用程序,并展示了如何离散化这些精确的数学。《MathematicalProblemsinImageProcessing》展示了它对数学领域的贡献,并突出了未解决的理论问题。而对于计算机视觉社区,此书提出了一个清晰、自洽的涉及数学的图像处理问题。值得一提的是,第二版《Mathematical Problems in Image Processing》提供了对PDE框架所涵盖的图像处理应用程序进展的回顾,并更新了现有的材料,同时,本书还提供了用于以最小的努力创建模拟的编程工具,十分难得。

      DT时代,想成为朋友圈中人人膜拜的图像处理高手?从阅读开始吧!


    展开全文
  • 图像处理(image processing),用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。图像处理一般指数字图像处理。数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的...

    图像处理(image processing),用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。图像处理一般指数字图像处理。数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的元素称为像素,其值称为灰度值。图像处理技术一般包括图像压缩,增强和复原,匹配、描述和识别3个部分。

    概述

    编辑
    21世纪是一个充满信息的时代,图像作为人类感知世界的视觉基础,是人类获取信息、表达信息和传递信息的重要手段。数字图像处理,即用计算机对图像进行处理,其发展历史并不长。数字图像处理技术源于20世纪20年代,当时通过海底电缆从英国伦敦到美国纽约传输了一幅照片,采用了数字压缩技术。首先数字图像处理技术可以帮助人们更客观、准确地认识世界,人的视觉系统可以帮助人类从外界获取3/4以上的信息,而图像、图形又是所有视觉信息的载体,尽管人眼的鉴别力很高,可以识别上千种颜色,但很多情况下,图像对于人眼来说是模糊的甚至是不可见的,通过图象增强技术,可以使模糊甚至不可见的图像变得清晰明亮。
    在计算机中,按照颜色和灰度的多少可以将图像分为二值图像灰度图像索引图像和真彩色RGB图像四种基本类型。大多数图像处理软件都支持这四种类型的图像。
    中国物联网校企联盟认为图像处理将会是物联网产业发展的重要支柱之一,它的具体应用是指纹识别技术[1]  。

    常用方法

    编辑
    1 )图像变换:由于图像阵列很大,直接在空间域中进行处理,涉及计算量很大。因此,往往采用各种图像变换的方法,如傅立叶变换、沃尔什变换、离散余弦变换等间接处理技术,将空间域的处理转换为变换域处理,不仅可减少计算量,而且可获得更有效的处理(如傅立叶变换可在频域中进行数字滤波处理)。目前新兴研究的小波变换在时域和频域中都具有良好的局部化特性,它在图像处理中也有着广泛而有效的应用。
    2 )图像编码压缩:图像编码压缩技术可减少描述图像的数据量(即比特数),以便节省图像传输、处理时间和减少所占用的存储器容量。压缩可以在不失真的前提下获得,也可以在允许的失真条件下进行。编码是压缩技术中最重要的方法,它在图像处理技术中是发展最早且比较成熟的技术。
    3 )图像增强和复原:图像增强和复原的目的是为了提高图像的质量,如去除噪声,提高图像的清晰度等。图像增强不考虑图像降质的原因,突出图像中所感兴趣的部分。如强化图像高频分量,可使图像中物体轮廓清晰,细节明显;如强化低频分量可减少图像中噪声影响。图像复原要求对图像降质的原因有一定的了解,一般讲应根据降质过程建立“降质模型”,再采用某种滤波方法,恢复或重建原来的图像。
    4 )图像分割:图像分割是数字图像处理中的关键技术之一。图像分割是将图像中有意义的特征部分提取出来,其有意义的特征有图像中的边缘、区域等,这是进一步进行图像识别、分析和理解的基础。虽然目前已研究出不少边缘提取、区域分割的方法,但还没有一种普遍适用于各种图像的有效方法。因此,对图像分割的研究还在不断深入之中,是目前图像处理中研究的热点之一。
    5 )图像描述:图像描述是图像识别和理解的必要前提。作为最简单的二值图像可采用其几何特性描述物体的特性,一般图像的描述方法采用二维形状描述,它有边界描述和区域描述两类方法。对于特殊的纹理图像可采用二维纹理特征描述。随着图像处理研究的深入发展,已经开始进行三维物体描述的研究,提出了体积描述、表面描述、广义圆柱体描述等方法。
    6 )图像分类(识别):图像分类(识别)属于模式识别的范畴,其主要内容是图像经过某些预处理(增强、复原、压缩)后,进行图像分割和特征提取,从而进行判决分类。图像分类常采用经典的模式识别方法,有统计模式分类和句法(结构)模式分类,近年来新发展起来的模糊模式识别和人工神经网络模式分类在图像识别中也越来越受到重视。

    图像

    编辑

    二值图像

    一幅二值图像的二维矩阵仅由0、1两个值构成,“0”代表黑色,“1”代白色。由于每一像素(矩阵中每一元素)取值仅有0、1两种可能,所以计算机中二值图像的数据类型通常为1个二进制位。二值图像通常用于文字、线条图的扫描识别(OCR)和掩膜图像的存储。

    灰度图像

    灰度图像矩阵元素的取值范围通常为[0,255]。因此其数据类型一般为8位无符号整数的(int8),这就是人们经常提到的256灰度图像。“0”表示纯黑色,“255”表示纯白色,中间的数字从小到大表示由黑到白的过渡色。在某些软件中,灰度图像也可以用双精度数据类型(double)表示,像素的值域为[0,1],0代表黑色,1代表白色,0到1之间的小数表示不同的灰度等级。二值图像可以看成是灰度图像的一个特例。

    索引图像

    索引图像的文件结构比较复杂,除了存放图像的二维矩阵外,还包括一个称之为颜色索引矩阵MAP的二维数组。MAP的大小由存放图像的矩阵元素值域决定,如矩阵元素值域为[0,255],则MAP矩阵的大小为256Ⅹ3,用MAP=[RGB]表示。MAP中每一行的三个元素分别指定该行对应颜色的红、绿、蓝单色值,MAP中每一行对应图像矩阵像素的一个灰度值,如某一像素的灰度值为64,则该像素就与MAP中的第64行建立了映射关系,该像素在屏幕上的实际颜色由第64行的[RGB]组合决定。也就是说,图像在屏幕上显示时,每一像素的颜色由存放在矩阵中该像素的灰度值作为索引通过检索颜色索引矩阵MAP得到。索引图像的数据类型一般为8位无符号整形(int8),相应索引矩阵MAP的大小为256Ⅹ3,因此一般索引图像只能同时显示256种颜色,但通过改变索引矩阵,颜色的类型可以调整。索引图像的数据类型也可采用双精度浮点型(double)。索引图像一般用于存放色彩要求比较简单的图像,如Windows中色彩构成比较简单的壁纸多采用索引图像存放,如果图像的色彩比较复杂,就要用到RGB真彩色图像。

    RGB彩色图像

    RGB图像与索引图像一样都可以用来表示彩色图像。与索引图像一样,它分别用红(R)、绿(G)、蓝(B)三原色的组合来表示每个像素的颜色。但与索引图像不同的是,RGB图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由R、G、B三个分量来表示,M、N分别表示图像的行列数,三个M x N的二维矩阵分别表示各个像素的R、G、B三个颜色分量。RGB图像的数据类型一般为8位无符号整形,通常用于表示和存放真彩色图像,当然也可以存放灰度图像。
    数字化图像数据有两种存储方式[6]:位图存储(Bitmap)和矢量存储(Vector)
    我们平常是以图像分辨率(即像素点)和颜色数来描述数字图象的。例如一张分辨率为640*480,16位色的数字图片,就由2^16=65536种颜色的307200(=640*480)个素点组成。
    位图图像:位图方式是将图像的每一个象素点转换为一个数据,当图像是单色(只有黑白二色)时,8个象素点的数据只占据一个字节(一个字节就是8个二进制数,1个二进制数存放象素点);16色(区别于前段“16位色”)的图像每两个象素点用一个字节存储;256色图像每一个象素点用一个字节存储。这样就能够精确地描述各种不同颜色模式的图像图面。位图图像弥补了矢量式图像的缺陷,它能够制作出色彩和色调变化丰富的图像,可以逼真地表现自然界的景象,同时也可以很容易地在不同软件之间交换文件,这就是位图图像的优点;而其缺点则是它无法制作真正的3D图像,并且图像缩放和旋转时会产生失真的现象,同时文件较大,对内存和硬盘空间容量的需求也较高。位图方式就是将图像的每一像素点转换为一个数据。如果用1位数据来记录,那么它只能代表2种颜色(2^1=2);如果以8位来记录,便可以表现出256种颜色或色调(2^8=256),因此使用的位元素越多所能表现的色彩也越多。通常我们使用的颜色有16色、256色、增强16位和真彩色24位。一般所说的真彩色是指24位(2^24)的位图存储模式适合于内容复杂的图像和真实照片。但随着分辨率以及颜色数的提高,图像所占用的磁盘空间也就相当大;另外由于在放大图像的过程中,其图像势必要变得模糊而失真,放大后的图像像素点实际上变成了像素“方格”。 用数码相机和扫描仪获取的图像都属于位图。
    矢量图像:矢量图像存储的是图像信息的轮廓部分,而不是图像的每一个象素点。例如,一个圆形图案只要存储圆心的坐标位置和半径长度,以及圆的边线和内部的颜色即可。该存储方式的缺点是经常耗费大量的时间做一些复杂的分析演算工作,图像的显示速度较慢;但图像缩放不会失真;图像的存储空间也要小得多。所以,矢量图比较适合存储各种图表和工程

    数据

    编辑
    图像处理离不开海量、丰富的基础数据,包括视频、静态图像等多种格式,如Berkeley分割数据集和基准500 (BSDS500)、西门菲沙大学不同光照物体图像数据库、神经网络人脸识别数据、CBCL-MIT StreetScenes(麻省理工学院街景数据库)等。

    数字化

    编辑
    通过取样和量化过程将一个以自然形式存在的图像变换为适合计算机处理的数字形式。图像在计算机内部被表示为一个数字矩阵,矩阵中每一元素称为像素。图像数字化需要专门的设备,常见的有各种电子的和光学的扫描设备,还有机电扫描设备和手工操作的数字化仪。

    图像编码

    编辑
    对图像信息编码,以满足传输和存储的要求。编码能压缩图像的信息量,但图像质量几乎不变。为此,可以采用模拟处理技术,再通过模-数转换得到编码,不过多数是采用数字编码技术。编码方法有对图像逐点进行加工的方法,也有对图像施加某种变换或基于区域、特征进行编码的方法。脉码调制、微分脉码调制、预测码和各种变换都是常用的编码技术。

    图像压缩

    编辑
    由数字化得到的一幅图像的数据量十分巨大,一幅典型的数字图像通常由500×500或1000×1000个像素组成。如果是动态图像,其数据量更大。因此图像压缩对于图像的存储和传输都十分必要。
    图像压缩有两类压缩算法,即无损压缩和有损压缩。最常用的无损压缩算法取空间或时间上相邻像素值的差,再进行编码。游程码就是这类压缩码的例子。有损压缩算法大都采用图像交换的途径,例如对图像进行快速傅里叶变换或离散的余弦变换。已作为图像压缩国际标准的JPEG和MPEG均属于有损压缩算法。前者用于静态图像,后者用于动态图像。它们都由芯片实现[2]  。

    增强复原

    编辑
    图像增强的目标是改进图片的质量,例如增加对比度,去掉模糊和噪声,修正几何畸变等;图像复原是在假定已知模糊或噪声的模型时,试图估计原图像的一种技术。
    图像增强按所用方法可分成频率域法和空间域法。前者把图像看成一种二维信号,对其进行基于二维傅里叶变换的信号增强。采用低通滤波(即只让低频信号通过)法,可去掉图中的噪声;采用高通滤波法,则可增强边缘等高频信号,使模糊的图片变得清晰。具有代表性的空间域算法有局部求平均值法和中值滤波(取局部邻域中的中间像素值)法等,它们可用于去除或减弱噪声[3]  。
    早期的数字图像复原亦来自频率域的概念。现代采取的是一种代数的方法,即通过解一个大的方程组来复原理想的图片。
    以提高图像质量为目的的图像增强和复原对于一些难以得到的图片或者在拍摄条件十分恶劣情况下得到的图片都有广泛的应用。例如从太空中拍摄到的地球或其他星球的照片,用电子显微镜或X光拍摄的生物医疗图片等。
    图像增强 使图像清晰或将其转换为更适合人或机器分析的形式。与图像复原不同,图像增强并不要求忠实地反映原始图像。相反,含有某种失真(例如突出轮廓线)的图像可能比无失真的原始图像更为清晰。常用的图像增强方法有:①灰度等级直方图处理:使加工后的图像在某一灰度范围内有更好的对比度;②干扰抑制:通过低通滤波、多图像平均、施行某类空间域算子等处理,抑制叠加在图像上的随机性干扰;③边缘锐化:通过高通滤波、差分运算或某种变换,使图形的轮廓线增强;④伪彩色处理:将黑白图像转换为彩色图像,从而使人们易于分析和检测图像包含的信息。
    图像复原 除去或减少在获得图像过程中因各种原因产生的退化。这类原因可能是光学系统的像差或离焦、摄像系统与被摄物之间的相对运动、电子或光学系统的噪声和介于摄像系统与被摄像物间的大气湍流等。图像复原常用二种方法。当不知道图像本身的性质时,可以建立退化源的数学模型,然后施行复原算法除去或减少退化源的影响。当有了关于图像本身的先验知识时,可以建立原始图像的模型,然后在观测到的退化图像中通过检测原始图像而复原图像。
    图像分割将图像划分为一些互不重叠的区域,每一区域是像素的一个连续集。通常采用把像素分入特定区域的区域法和寻求区域之间边界的境界法。区域法根据被分割对象与背景的对比度进行阈值运算,将对象从背景中分割出来。有时用固定的阈值不能得到满意的分割,可根据局部的对比度调整阈值,这称为自适应阈值。境界法利用各种边缘检测技术,即根据图像边缘处具有很大的梯度值进行检测。这两种方法都可以利用图像的纹理特性实现图像分割。

    形态学

    编辑
    形态学一词通常指生物学的一个分支,它用于处理动物和植物的形状和结构。在数学形态学的语境中也使用该词来作为提取图像分量的一种工具,这些分量在表示和描述区域形状(如边界,骨骼和凸壳)时是很有用的。此外,我们还很关注用于预处理和后处理的形态学技术,如形态学滤波、细化和裁剪。
    数学形态学的基本运算
    数学形态学的基本运算有4个:腐蚀、膨胀、开启和闭合。数学形态学方法利用一个称作结构元素的”探针”收集图像的信息,当探针在图像中不断移动时,便可考察图像各个部分之间的相互关系,从而了解图像的结构特征。在连续空间中,灰度图像的腐蚀、膨胀、开启和闭合运算分别表述如下。
    腐蚀
    腐蚀“收缩”或“细化”二值图像中的对象。收缩的方式和程度由一个结构元素控制。数学上,A被B腐蚀,记为AΘB,定义为:
    换言
    腐蚀运算腐蚀运算
    之,A被B腐蚀是所有结构元素的原点位置的集合,其中平移的B与A的背景并不叠加。
    膨胀
    膨胀是在二值图像中“加长”或“变粗”的操作。这种特殊的方式和变粗的程度由一个称为结构元素的集合控制。结构元素通常用0和1的矩阵表示。数学上,膨胀定义为集合运算。A被B膨胀,记为A⊕B,定义为:
    膨胀运算膨胀运算
    其中,Φ为空集,B为结构元素。总之,A被B膨胀是所有结构元素原点位置组成的集合,其中映射并平移后的B至少与A的某些部分重叠。这种在膨胀过程中对结构元素的平移类似于空间卷积。
    膨胀满足交换律,即A⊕B=B⊕A。在图像处理中,我们习惯令A⊕B的第一个操作数为图像,而第二个操作数为结构元素,结构元素往往比图像小得多。
    膨胀满足结合律,即A⊕(B⊕C)=(A⊕B)⊕C。假设一个结构元素B可以表示为两个结构元素B1和B2的膨胀,即B=B1⊕B2,则A⊕B=A⊕(B1⊕B2)=(A⊕B1)⊕B2,换言之,用B膨胀A等同于用B1先膨胀A,再用B2膨胀前面的结果。我们称B能够分解成B1和B2两个结构元素。结合律很重要,因为计算膨胀所需要的时间正比于结构元素中的非零像素的个数。通过结合律,分解结构元素,然后再分别用子结构元素进行膨胀操作往往会实现很客观的速度的增长。

    开启

    A被B的形态学开
    开运算开运算
    运算可以记做A?B,这种运算是A被B腐蚀后再用B来膨胀腐蚀结果,即:
    开运算的数学公式为:
    其中
    开运算开运算
    ,∪{·}指大括号中所有集合的并集。该公式的简单几何解释为:A?B是B在A内完全匹配的平移的并集。形态学开运算完全删除了不能包含结构元素的对象区域,平滑了对象的轮廓,断开了狭窄的连接,去掉了细小的突出部分。

    闭合

    A被B形态学闭运算记做A·B,它是先膨胀后腐蚀的结果:
    从几何学
    闭运算闭运算
    上讲,A·B是所有不与A重叠的B的平移的并集。想开运算一样,形态学闭运算会平滑对象的轮廓。然后,与开运算不同的是,闭运算一般会将狭窄的缺口连接起来形成细长的弯口,并填充比结构元素小的洞。
    基于这些基本运算可以推导和组合成各种数学形态学实用算法,用它们可以进行图像形状和结构的分析及处理,包括图像分割、特征提取、边界检测、图像降噪、图像增强和恢复等。

    图像分析

    编辑
    从图像中抽取某些有用的度量、数据或信息。目的是得到某种数值结果,而不是产生另一个图像。图像分析的内容和模式识别、人工智能的研究领域有交叉,但图像分析与典型的模式识别有所区别。图像分析不限于把图像中的特定区域按固定数目的类别加以分类,它主要是提供关于被分析图像的一种描述。为此,既要利用模式识别技术,又要利用关于图像内容的知识库,即人工智能中关于知识表达方面的内容。图像分析需要用图像分割方法抽取出图像的特征,然后对图像进行符号化的描述。这种描述不仅能对图像中是否存在某一特定对象作出回答,还能对图像内容作出详细描述。
    图像处理的各个内容是互相有联系的。一个实用的图像处理系统往往结合应用几种图像处理技术才能得到所需要的结果。图像数字化是将一个图像变换为适合计算机处理的形式的第一步。图像编码技术可用以传输和存储图像。图像增强和复原可以是图像处理的最后目的,也可以是为进一步的处理作准备。通过图像分割得出的图像特征可以作为最后结果,也可以作为下一步图像分析的基础。
    图像匹配、描述和识别对图像进行比较和配准,通过分制提取图像的特征及相互关系,得到图像符号化的描述,再把它同模型比较,以确定其分类。图像匹配试图建立两张图片之间的几何对应关系,度量其类似或不同的程度。匹配用于图片之间或图片与地图之间的配准,例如检测不同时间所拍图片之间景物的变化,找出运动物体的轨迹[4]  。
    从图像中抽取某些有用的度量、数据或信息称为图像分析。图像分析的基本步骤是把图像分割成一些互不重叠的区域,每一区域是像素的一个连续集,度量它们的性质和关系,最后把得到的图像关系结构和描述景物分类的模型进行比较,以确定其类型。识别或分类的基础是图像的相似度。一种简单的相似度可用区域特征空间中的距离来定义。另一种基于像素值的相似度量是图像函数的相关性。最后一种定义在关系结构上的相似度称为结构相似度。
    以图片分析和理解为目的的分割、描述和识别将用于各种自动化的系统,如字符和图形识别、用机器人进行产品的装配和检验、自动军事目标识别和跟踪、指纹识别、X光照片和血样的自动处理等。在这类应用中,往往需综合应用模式识别和计算机视觉等技术,图像处理更多的是作为前置处理而出现的。
    多媒体应用的掀起,对图像压缩技术的应用起了很大的推动作用。图像,包括录像带一类动态图像将转为数字图像,并和文字、声音、图形一起存储在计算机内,显示在计算机的屏幕上。它的应用将扩展到教育、培训和娱乐等新的领域[5]  。

    应用

    编辑
    摄影及印刷
    卫星图像处理(Satellite image processing)
    医学图像处理(Medical image processing)
    面孔识别,特征识别(Face detection, feature detection, face identification)
    显微图像处理(Microscope image processing)
    汽车障碍识别(Car barrier detection)[6] 

    常见软件

    编辑

    Adobe Photoshop

    软件特点:知名度以及使用率最高的图像处理软件
    软件优势:使用业界标准的Adobe PhotoshopCS软件更加快速地获取更好效果,同时为图形和Web设计、摄影及视频提供必不可少的新功能。
    与同行软件的比较:这回Adobe的确给设计师们带来了很大的惊喜,Photoshop CS新增了许多强有力的功能,特别是对于摄影师来讲,这次它大大突破了以往Photoshop系列产品更注重平面设计的局限性,对数码暗房的支持功能有了极大的加强和突破。
    近期版本:2016年11月2日,Adobe 公司更新了旗下 Photoshop CC 2017最新版。[7] 

    Adobe Illustrator

    软件特点:专业矢量绘图工具,功能强大,界面友好。
    软件优势:无论您是生产印刷出版线稿的设计者和专业插画家、生产多媒体图像的艺术家、还是互联网页或在线内容的制作者,都会发现Illustrator不仅仅是一个艺术产品工具,能适合大部分小型设计到大型的复杂项目。
    与同行软件的比较:功能极其强大,操作相当专业。与Adobe公司其它软件如Photoshop、Primiere及Indesign等软件可以良好的兼容,在专业领域优势比较明显。

    CorelDRAW

    软件特点:界面设计友好,空间广阔,操作精微细致。兼容性佳。
    软件优势:非凡的设计能力广泛地应用于商标设计、标志制作、模型绘制、插图描画、排版及分色输出等等诸多领域。市场领先的文件兼容性以及高质量的内容可帮助您将创意变为专业作品。从与众不同的徽标和标志到引人注目的营销材料以及令人赏心悦目的Web图形,应有尽有。
    与同行软件的比较:功能强大,兼容性极好,可生成各种与其它软件相兼容的格式,操作较Illustrator简单,在国内中小型广告设计公司应用率极高。

    可牛影像

    软件特点:可牛影像是新一代的图片处理软件,独有美白祛痘、瘦脸瘦身、明星场景、多照片叠加等功能,更有50余种照片特效,数秒即可制作出影楼级的专业照片。
    软件优势:图片编辑、人像美容、场景日历、添加水印饰品、添加各种艺术字体、制作动感闪图、摇头娃娃、多图拼接,使人能想到的功能,应有尽有,而且简单易用。
    与同行软件的比较:场景日历、动感闪图、摇头娃娃等都是传统图像处理软件所没有的。有了可牛影像,不需要再像photoshop那样,需要专业的技能才能处理照片。

    光影魔术手

    软件特点:“nEO iMAGING”〖光影魔术手〗是一个对数码照片画质进行改善及效果处理的软件。简单、易用,不需要任何专业的图像技术,就可以制作出专业胶片摄影的色彩效果。
    软件优势:模拟反转片的效果,令照片反差更鲜明,色彩更亮丽,模拟反转负冲的效果,色彩诡异而新奇,模拟多类黑白胶片的效果,在反差、对比方面,和数码相片完全不同。
    与同行软件的比较:是一个照片画质改善和个性化处理的软件。简单、易用,每个人都能制作精美相框、艺术照、专业胶片效果,而且完全免费。

    ACDSee

    软件特点:不论您拍摄的相片是什么类型-家人与朋友的,或是作为业余爱好而拍摄的艺术照-您都需要相片管理软件来轻松快捷地整理以及查看、修正和共享这些相片。
    软件优势:ACDSee 9可以从任何存储设备快速“获取相片”,还可以使用受密码保护的“隐私文件夹”这项新功能来存储机密信息。
    与同行软件的比较:强大的电子邮件选项、幻灯放映、CD/DVD刻录,还有让共享相片变得轻而易举的网络相册工具。使用红眼消除、色偏消除、曝光调整以及“相片修复”工具等快速修正功能来改善相片。

    Macromedia Flash

    软件特点:一个可视化的网页设计和网站管理工具,支持最新的Web技术,包含HTML检查、HTML格式控制、HTML格式化选项等。
    软件优势:除了新的视频和动画特性,还提供了新的绘图效果和更好的脚本支持,同时也集成了流行的视频辑和编码工具,还提供软件允许用户测试移动手机中的Flash内容等新功能。
    与同行软件的比较:在编辑上你可以选择可视化方式或者你喜欢的源码编辑方式。

    Ulead GIF Animator

    软件特点:友立公司出版的动画GIF制作软件,内建的Plugin有许多现成的特效可以立即套用,可将AVI文件转成动画GIF文件,而且还能将动画GIF图片最佳化,能将你放在网页上的动画GIF图档减肥,以便让人能够更快速的浏览网页。
    软件优势:这是一个很方便的GIF 动画制作软件,由Ulead Systems.Inc 创作。Ulead GIF Animator 不但可以把一系列图片保存为GIF 动画格式,还能产生二十多种2D 或3D 的动态效果,足以满足您制作网页动画的要求。
    与同行软件的比较:与其它图形文件格式不同的是, 一个GIF文件中可以储存多幅图片,这时, GIF 将其中存储的图片像播放幻灯片一样轮流显示, 这样就形成了一段动画[8]  。



    展开全文
  • ImagXpress是一款功能强大的twain图像处理控件,具有TWAIN扫描、压缩,浏览,注释,打印,图像处理,文档清洁,文件格式转换,使用该TWAIN扫描控件可以添加世界上最强大的图像处理功能到您的应用程序中,控件提供了...
  • 数字图像处理应用领域 图像是人类获取和交换信息的主要来源,因此,图像处理的应用领域必然涉及到人类生活和工作的方方面面。随着人类活动范围的不断扩大,图像处理的应用领域也将随之不断扩大。 1)航天和航空方面 ...
  •  本章用到了《VC + + 图像处理程序设计》这本书中第一章的CDib类,大家可以百度一下再来看这篇博文。博文也是在学习这本书时写的,只是根据自己的理解在书中给的一些代码做一下整理和注释,以便日后查看。  一...
  • 数字图像处理方法的重要性源于两个主要应用领域: 改善图像信息以便解释。 为存储、传输和表示而对图像数据进行处理,以便于机器自动理解。 图像处理(image processing): 用计算机对图像...
  • 想用android手机的摄像头扫描不断提取图像,对图像进行处理,若处理完成则退出,无法处理则继续通过摄像头提取图像处理。 请问应该通过什么方法达到这种效果? 多谢多谢!
  • 本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程《数字图像处理》及课件进行讲解,主要通过MFC单文档视图实现显示BMP图像增强处理,包括图像普通平滑、高斯平滑、不同算子的图像锐化知识...
  • 接着上篇博文《 多边形的扫描转换》 转载请注明出处:http://blog.csdn.net/xiaowei_cqu/article/details/7712451 多边形 边相关扫描线填充算法需要建立两张表:新边表(New Edge Table,NET)和 活动边表...
  • 说到图像处理软件你会想到什么?Photoshop?CorelDRAW?美图秀秀?还是ACDSee的图像编辑模块? 说到实现数字图像处理算法,你又会想到什么?Matlab?OpenCV? 能不能自己动手用C++写一个小型的图像处理软件,实现...
  • FPGA与图像处理

    2018-06-07 20:07:55
    用FPGA做图像处理最关键的一点优势就是:FPGA能进行实时流水线运算,能达到最高的实时性。因此在一些对实时性要求非常高的应用领域,做图像处理基本就只能用FPGA。例如在一些分选设备中图像处理基本上用的都是FPGA,...
  • 目前,多数图像处理控件基本上都自带OCR引擎,识别数据库,以及多语言字典等高级功能。这几个高级功能中,使用OCR功能将扫描图像转换成可搜索文本文件,是最为有必要的功能。如果没有OCR功能、多语言字典和识别...
  • 图像处理与识别

    2017-03-23 09:45:57
    数字图像处理是对图像进行分析、加工、和处理,使其满足视觉、心理以及其他要求的技术。图像处理是信号处理在图像域上的一个应用。目前大多数的图像是以数字形式存储,因而图像处理很多情况下指数字图像处理。此外,...
  • 什么是数字图像处理?历史、以及它所研究的内容 本文引用地址:http://www.eepw.com.cn/article/201702/344072.htm  说起图像处理,你会想到什么?你是否真的了解这个领域所研究的内容。纵向来说,数字图像处理...
  • 图像处理与识别学习小结   数字图像处理是对图像进行分析、加工、和处理,使其满足视觉、心理以及其他要求的技术。图像处理是信号处理在图像域上的一个应用。目前大多数的图像是以数字形式存储,因而图像处理很多...
  • 在数字图像处理中,Lena(Lenna)是一张被广泛使用的标准图片,特别在图像压缩的算法研究中。 (为什么用这幅图,是因为这图的各个频段的能量都很丰富:即有低频(光滑的皮肤),也有高频(帽子上的羽毛),很...
1 2 3 4 5 ... 20
收藏数 61,962
精华内容 24,784