向后映射 数字图像处理
2019-01-13 10:41:12 h84121599 阅读数 403

这两个映射都是指将原图经过图片变换到新图的一个过程,只是方式不同。

 

向前映射的方法是,以原图每个像素为基准计算被它影响的新图像素。

向后映射的方法是,以新图每个像素为基准计算影响它的原图像素。

 

参考:https://blog.csdn.net/glorydream2015/article/details/44873703

2017-03-08 10:55:27 guduruyu 阅读数 14800

在图像处理,尤其是医学图像处理的过程中,我们经常会遇到将灰度图映射成彩色图的情形,如将灰度图根据灰度的高低映射成彩虹色图。这个过程我们通常将之称为伪彩映射,伪彩映射的关键在于找到合适的彩色映射表,即colormap,也称color bar。

前段时间做了一个涉及到伪彩映射的项目,在找colormap的过程中,我发现Python的matplotlib模块中内嵌了一大批常用的colormaps,使用如下代码:

import numpy as np
import matplotlib.pyplot as plt

# Have colormaps separated into categories:
# http://matplotlib.org/examples/color/colormaps_reference.html

cmaps = [('Perceptually Uniform Sequential',
                            ['viridis', 'inferno', 'plasma', 'magma']),
         ('Sequential',     ['Blues', 'BuGn', 'BuPu',
                             'GnBu', 'Greens', 'Greys', 'Oranges', 'OrRd',
                             'PuBu', 'PuBuGn', 'PuRd', 'Purples', 'RdPu',
                             'Reds', 'YlGn', 'YlGnBu', 'YlOrBr', 'YlOrRd']),
         ('Sequential (2)', ['afmhot', 'autumn', 'bone', 'cool',
                             'copper', 'gist_heat', 'gray', 'hot',
                             'pink', 'spring', 'summer', 'winter']),
         ('Diverging',      ['BrBG', 'bwr', 'coolwarm', 'PiYG', 'PRGn', 'PuOr',
                             'RdBu', 'RdGy', 'RdYlBu', 'RdYlGn', 'Spectral',
                             'seismic']),
         ('Qualitative',    ['Accent', 'Dark2', 'Paired', 'Pastel1',
                             'Pastel2', 'Set1', 'Set2', 'Set3']),
         ('Miscellaneous',  ['gist_earth', 'terrain', 'ocean', 'gist_stern',
                             'brg', 'CMRmap', 'cubehelix',
                             'gnuplot', 'gnuplot2', 'gist_ncar',
                             'nipy_spectral', 'jet', 'rainbow',
                             'gist_rainbow', 'hsv', 'flag', 'prism'])]


nrows = max(len(cmap_list) for cmap_category, cmap_list in cmaps)
gradient = np.linspace(0, 1, 256)
gradient = np.vstack((gradient, gradient))


def plot_color_gradients(cmap_category, cmap_list):
    fig, axes = plt.subplots(nrows=nrows)
    fig.subplots_adjust(top=0.95, bottom=0.01, left=0.2, right=0.99)
    axes[0].set_title(cmap_category + ' colormaps', fontsize=14)

    for ax, name in zip(axes, cmap_list):
        ax.imshow(gradient, aspect='auto', cmap=plt.get_cmap(name))
        pos = list(ax.get_position().bounds)
        x_text = pos[0] - 0.01
        y_text = pos[1] + pos[3]/2.
        fig.text(x_text, y_text, name, va='center', ha='right', fontsize=10)

    # Turn off *all* ticks & spines, not just the ones with colormaps.
    for ax in axes:
        ax.set_axis_off()

for cmap_category, cmap_list in cmaps:
    plot_color_gradients(cmap_category, cmap_list)

plt.show()

我们可以得到matplotlib中内嵌的colormaps(应该是全部,但不是很确定):








如何获取colormap

如此众多的colormaps,应该能满足我们大部分的需求。当然,我们更关心的是如何将这些colormap中具体的数值导出来,这样使用起来会更加的灵活方便。当然,只要你想做到,是没有什么能够阻拦你的。

以获取最常用的jet映射表为例,我们可以使用如下代码分别获取整型和浮点型的jet map,并将其保存在txt文件中:

from matplotlib import cm

def get_jet():

    colormap_int = np.zeros((256, 3), np.uint8)
    colormap_float = np.zeros((256, 3), np.float)

    for i in range(0, 256, 1):
       colormap_float[i, 0] = cm.jet(i)[0]
       colormap_float[i, 1] = cm.jet(i)[1]
       colormap_float[i, 2] = cm.jet(i)[2]

       colormap_int[i, 0] = np.int_(np.round(cm.jet(i)[0] * 255.0))
       colormap_int[i, 1] = np.int_(np.round(cm.jet(i)[1] * 255.0))
       colormap_int[i, 2] = np.int_(np.round(cm.jet(i)[2] * 255.0))

    np.savetxt("jet_float.txt", colormap_float, fmt = "%f", delimiter = ' ', newline = '\n')
    np.savetxt("jet_int.txt", colormap_int, fmt = "%d", delimiter = ' ', newline = '\n')

    print colormap_int

    return

获取其他种类的colormap与之类似:

def get_spectral():

    colormap_int = np.zeros((256, 3), np.uint8)
    colormap_float = np.zeros((256, 3), np.float)

    for i in range(0, 256, 1):
       colormap_float[i, 0] = cm.spectral(i)[0]
       colormap_float[i, 1] = cm.spectral(i)[1]
       colormap_float[i, 2] = cm.spectral(i)[2]

       colormap_int[i, 0] = np.int_(np.round(cm.spectral(i)[0] * 255.0))
       colormap_int[i, 1] = np.int_(np.round(cm.spectral(i)[1] * 255.0))
       colormap_int[i, 2] = np.int_(np.round(cm.spectral(i)[2] * 255.0))

    np.savetxt("spectral_float.txt", colormap_float, fmt = "%f", delimiter = ' ', newline = '\n')
    np.savetxt("spectral_int.txt", colormap_int, fmt = "%d", delimiter = ' ', newline = '\n')

    print colormap_int

    return

当然,我们也可以根据需要对获得的colormap中的值进行调整。当我们获得心仪的colormap之后,伪彩映射就成了水到渠成的事情了。

下面是用Python写的伪彩映射的代码:

def gray2color(gray_array, color_map):
    
    rows, cols = gray_array.shape
    color_array = np.zeros((rows, cols, 3), np.uint8)

    for i in range(0, rows):
        for j in range(0, cols):
            color_array[i, j] = color_map[gray_array[i, j]]
    
    #color_image = Image.fromarray(color_array)

    return color_array

def test_gray2color():
    gray_image = Image.open('Image.png').convert("L")

    gray_array = np.array(gray_image)
    
    figure()
    subplot(211)
    plt.imshow(gray_array, cmap = 'gray')

    jet_map = np.loadtxt('E:\\Development\\Thermal\\ColorMaps\\jet_int.txt', dtype = np.int)
    color_jet = gray2color(gray_array, jet_map)
    subplot(212)
    plt.imshow(color_jet)

    show()

    return



这一篇先就介绍到这里,后面一篇将向大伙介绍如何使用python生成自定义的colormap。


2019-03-21 20:36:00 qq_36190978 阅读数 119

python-图像处理(映射变换)

做计算机视觉方向,除了流行的各种深度学习算法,很多时候也要会基础的图像处理方法。

记录下opencv的一些操作(图像映射变换),日后可以方便使用

先上一张效果图

图二和图三是同一种方法,只是变换矩阵不同,都是3点映射变换

图四使用的是4点映射变换

--------------------------------------------------------------------------------------------------------------------------------------------------

简单介绍下原理

图像都知道是3维(通道)的矩阵,前两维就是由1字节(0-255)数字填充的二维数组。数字大小代表颜色的深浅。

我们把变换前的原图作为x和y。变换后的图为u和v。将[x,y,1]乘上变换矩阵就可以得到对应的新的u和v。不同的变换矩阵有不同的作用(不同的变换方式)

-------------------------------------------------------------------------------------------------------------------------------------------------

所以现在就是求不同变换对应的不同的变换矩阵的过程

求这个矩阵 在opencv中直接就有方法 

只需提供原图的三个点和你要变换之后的三个点的映射位置(3个原图点,3个映射点)就可以求出这个变换矩阵

         

当然了  你会发现不管怎么调整映射点 都不能任意变换

因为只给三个点时 变换之后的图其实只是原图的等比缩放,并不能做到随意映射的效果

 

这里opencv也提供了 四个点和四个映射的方法 求出对应的变换矩阵 ,最终得到任意映射的效果

 

代码如下:

 1 # coding=gbk
 2 import cv2
 3 import numpy as np
 4 import matplotlib.pyplot as plt
 5 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
 6 plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
 7 
 8 img=cv2.imread(r"test6.jpg")
 9 img = img[:,:,[2,1,0]]
10 cols,rows,ch=img.shape
11 
12 pts1 = np.float32([[0, 0], [cols - 1, 0], [0, rows - 1]])                                 #三点映射
13 pts2 = np.float32([[0, 0], [cols - 1, 0], [80, rows - 1]])
14 pts21 = np.float32([[0, 0], [cols - 1, 0], [0, rows - 1]])
15 pts22 = np.float32([[cols * 0.2, rows * 0.1], [cols * 0.9, rows * 0.2], [cols * 0.1, rows * 0.9]])
16 pts31 = np.float32([[0, 0], [cols - 1, 0], [0, rows - 1],[cols - 1,rows-1]])              #四点映射
17 pts32 = np.float32([[0, 0], [cols - 1, 0], [50, rows - 1],[cols - 50,rows-50]])
18 
19 M = cv2.getAffineTransform(pts1,pts2)                                                     #求三点映射的变换矩阵
20 M2= cv2.getAffineTransform(pts21,pts22)
21 M3 = cv2.getPerspectiveTransform(pts31,pts32)                                             #求四点映射的变换矩阵
22 
23 dst = cv2.warpAffine(img,M,(rows+120,cols))                                               #三点映射的变换函数
24 dst2 = cv2.warpAffine(img,M2,(rows,cols))                                               
25 dst3 = cv2.warpPerspective(img,M3,(rows+40,cols+50))                                      #四点映射的变换函数
26 
27 plt.subplot(221)
28 plt.imshow(img)
29 plt.title("原图")
30 plt.subplot(222)
31 plt.imshow(dst)
32 plt.title("投影变换")
33 plt.subplot(223)
34 plt.imshow(dst2)
35 plt.title("仿射原图变换")
36 plt.subplot(224)
37 plt.imshow(dst3)
38 plt.title("仿射不规则变换")
39 
40 plt.show()

 

posted @ 2019-03-21 20:36 剑峰随心 阅读(...) 评论(...) 编辑 收藏
2018-12-21 15:39:38 yql_617540298 阅读数 1074

        图像的几何变换:在不改变图像像素的前提下,对图像像素进行空间几何变换。常见的变换:距离变换,坐标映射,平移,镜像,旋转,缩放和仿射变换等等。

        图像的几何变换:建立了一种源图像像素与变换后的图像像素之间的映射关系。也正是通过这种映射关系可以知道原图像任意像素点变换后的坐标,或者是变换后的图像在原图像的坐标位置等。

一、前向映射

1. 数学公式表示:

表示输出图像像素的坐标;表示输入图像的像素坐标;而表示的是两种映射关系:线性映射或多项式映射;

存在问题:

(1)浮点坐标:如(1,1)映射成(0.5,0.5),这是无效坐标,这是可以用插算法进一步处理;

(2)映射不完全:输入图像的像素总数小于输出的像素总数,会使得输出图像的部分像素与原始图像并没有映射关系,如放大操作;

(3)映射重叠:与映射不完全正好相反,输出图像会存在映射后的像素重叠。

2. 前向映射矩阵表示法

其中表示输出图像像素的坐标,表示输入图像像素的坐标;

3. 前向映射也称为素移交映射

输出图像某一点的像素值不能直接得到,需要遍历输入图像的所有像素值,对其进行坐标变换,分配像素值到整数位置,才能得到输出图像各像素点的像素值。这是向前映射法的缺点;

二、后向映射

1. 数学公式表示

表示输出图像像素的坐标;表示输入图像的像素坐标;而表示的是两种映射关系;

解释:

(1)与前向映射相反,是由输出图像的像素坐标反过来推算为该像素在源图像中的坐标位置;

(2)在图像处理中,一般都是用后向映射来实现坐标变换的;

(3)前向映射中:适合一些改变图像大小的几何变换;

(4)后向映射中:适合图像旋转,不会改变几何大小。

2. 后向映射矩阵表示法

3. 后向映射也称为图像填充映射

 

2019-03-03 18:00:23 qq_40734628 阅读数 94

在VTK中,颜色映射的过程是由映射器mapper完成的。最终该标量值映射为何种颜色,还需要看颜色查询表中颜色的分配情况。如果不手动创建一个查询表,则映射器会使用一个默认的映射表。
我们可以手动创建一个颜色查找表,颜色查找表中允许我们自由设定颜色值。vtkLookupTable可以帮助我们来完成这个工作。

//定义一个颜色查找表
vtkLookupTable *lut=vtkLookupTable::New();
//设置需要映射的颜色的数目
lut->SetNumberOfTableValues(static_cast<vtkIdType>(vtkCells.size()/*cellIds->GetNumberOfIds()*/));
//设置颜色值的映射范围,如,我需要把0-100范围的数值通过颜色查
//找表获取一个标量值
lut->SetTableRange(0,100);
lut->Build();

……

//定义一个颜色标量
vtkUnsignedCharArray *cellData = vtkUnsignedCharArray::New();
cellData->SetNumberOfComponents(3);

	for (auto it = vtkCells.begin(); it != vtkCells.end(); it++)
	{
		//cout << "id: " << it->first << " " << "distance: " << it->second<< endl;
	
		distance = it->second;
		//get the rgb value from lut table according to the distance value
		
		lut->GetColor(static_cast<double>(distance), rgb);
	
	
		//convert the distance value to rgb value 
		for (size_t j = 0; j < 3; j++)
		{
			ucrgb[j] = static_cast<unsigned char>(rgb[j] * 255);
		
		}
		cellData->InsertTuple(it->first, ucrgb);


	}
	boneSurfG->GetOutput()->GetCellData()->SetScalars(cellData);
	
	//将数据可视化
	//Mapper,Actor,Render
	vtkSmartPointer<vtkPolyDataMapper> boneMapper =
		vtkSmartPointer<vtkPolyDataMapper>::New();
	boneMapper->SetInputData(boneSurf);
	vtkSmartPointer<vtkActor> boneActor =
		vtkSmartPointer<vtkActor>::New();
	boneMapper->SetScalarModeToUseCellData();
	
	boneMapper->Update();
	//delete original color
	//boneMapper->ScalarVisibilityOff();
	boneActor->SetMapper(boneMapper);
	……
	renderer->AddActor(boneActor);
	……
	renderWindowInteractor->Start();

以上介绍的是lookupTable的用法
下面是颜色映射在可视化的时候根据不同需要会使用到的映射方法

有时候,标量数据就是颜色值,并不需要通过查询表进行映射。对此,映射器提供了以下一些方法来进行控制。
● SetColorModeToDefault()该方法执行默认的映射器行为,即把unsigned char类型的标量属性数据当作颜色值,不执行隐式。对于其他类型的标量数据,将通过查询表映射。
● SetColorModeToMapScalars()无论变量数据是何种类型,该方法都通过查询表对标量数据进行映射。如果标量数据的每个元组有多个分量,则对第0个分量进行映射。

注意事项:

  1. 如果没有标量数据,则映射器将不能使用查询表控制对象的颜色。这时可以使用演员对象来控制颜色。
  2. 如果想阻止颜色映射,可调用映射器的ScalarVisibilityOff()方法。

调用ScalarVisibilityOn()方法后,可以控制映射器的颜色映射行为:
● SetScalarModeToDefault()执行默认的映射行为:如果有点标量属性数据,则用其进行映射,如果没有点标量属性数据但有单元标量属性数据,则用单元标量属性数据进行映射,否则不映射。
● SetScalarModeToUsePointData()总是使用点标量属性数据进行映射的。如果没有嗲按标量属性数据,就不进行映射。
● SetScalarModeToUseCellData()总是使用单元标量属性数据进行映射的。如果没有单元标量属性数据,就不进行映射。
● SetScalarModeToUsePointFieldData()不使用点或单元标量属性数据,而是使用点属性数据中的一般属性数据来进行映射的。该方法应该与ColorByArrayComponent()结合使用,以用来指定用于颜色映射的数据。
● SetScalarModeToUseCellFieldData()不使用点或单元标量属性数据,而是使用单元属性数据中的一般属性数据来进行映射的。该方法应该与ColorByArrayComponent()结合使用,以用来指定用于颜色映射的数据。

重映射

博文 来自: littleThink
没有更多推荐了,返回首页