C# .Net实现灰度图和HeatMap热力图winform(进阶)

目录
  • 一、前文
  • 二、渐进颜色调色板
  • 三、热力点大小和扩展大小

一、前文

前文可以参考我的前一篇博文:C# .Net实现简易灰度图和酷炫HeatMap热力图winform

但是,先前的热力图效果,我并不满意。不满意的地方主要有三点:

  • 热力图的颜色是通过一个调色板图片来实现,如果想要其他颜色,改起来比较麻烦
  • 热力图的扩散效果不好看,不够渐进
  • 热力图的每个点大小都一致,应该是大小不一才对

因此,我做了改进,上一个图是之前的效果,下一个图是改进后的效果

二、渐进颜色调色板

//创建调色板,颜色映射
private ColorMap[] CreatePalette()
{
    ColorMap[] colorMaps = new ColorMap[256];
    List<Color> newColors = new List<Color>();

    //颜色集合
    newColors.AddRange(GetGradientColorList(Color.Red, Color.Yellow, 64));
    newColors.AddRange(GetGradientColorList(Color.Yellow, Color.Green, 64));
    newColors.AddRange(GetGradientColorList(Color.Green, Color.Blue, 64));
    newColors.AddRange(GetGradientColorList(Color.Blue, Color.Navy, 64));
    //颜色调色板展示
    Bitmap colorBitmap = new Bitmap(colorPanel.Width, colorPanel.Height);

    Graphics graphic = Graphics.FromImage(colorBitmap);
    for (int i = 0; i < 256; i++)
    {
        SolidBrush solidBrush = new SolidBrush(newColors[i]);
        Rectangle rectangle = new Rectangle((int)(i * 2), 0, (int)2, colorPanel.Height);
        graphic.FillRectangle(solidBrush, rectangle);
        graphic.Save();
        solidBrush.Dispose();
    }
    colorPanel.BackgroundImage = colorBitmap;

    // 遍历每个像素并创建一个新的颜色映射
    for (int X = 0; X <= 255; X++)
    {
        colorMaps[X] = new ColorMap();
        colorMaps[X].OldColor = System.Drawing.Color.FromArgb(X, X, X);
        colorMaps[X].NewColor = System.Drawing.Color.FromArgb(255, newColors[X]);
    }
    return colorMaps;
}

/// <summary>
/// 获得两个颜色之间渐进颜色的集合
/// </summary>
/// <param name="sourceColor">起始颜色</param>
/// <param name="destColor">终止颜色</param>
/// <param name="count">渐进颜色的个数</param>
/// <returns>返回颜色集合</returns>
public static List<Color> GetGradientColorList(Color srcColor, Color desColor, int count)
{
    List<Color> colorFactorList = new List<Color>();
    int redSpan = desColor.R - srcColor.R;
    int greenSpan = desColor.G - srcColor.G;
    int blueSpan = desColor.B - srcColor.B;
    for (int i = 0; i < count; i++)
    {
        Color color = Color.FromArgb(
            srcColor.R + (int)((double)i / count * redSpan),
            srcColor.G + (int)((double)i / count * greenSpan),
            srcColor.B + (int)((double)i / count * blueSpan)
        );
        colorFactorList.Add(color);
    }
    return colorFactorList;
}

三、热力点大小和扩展大小

private void DrawHeatPoint2(Graphics graphics, HeatPoint heatPoint)
{
    Console.WriteLine("heatPoint.Intensity = " + heatPoint.Intensity);

    int radius = 40 * (heatPoint.Intensity+6) / 240;

    List<System.Drawing.Point> pointsList = new List<System.Drawing.Point>();
    for (double degrees = 0; degrees <= 360; degrees += 10)
    {
        // 在定义半径的圆的圆周上绘制新点
        // 使用点坐标、半径和角度
        // 计算这个迭代点在圆上的位置
        System.Drawing.Point point = new System.Drawing.Point();
        point.X = Convert.ToInt32(heatPoint.X + radius * Math.Cos((Math.PI / 180) * degrees));
        point.Y = Convert.ToInt32(heatPoint.Y + radius * Math.Sin((Math.PI / 180) * degrees));
        pointsList.Add(point);
    }

    // 创建新的颜色混合来告诉 PathGradientBrush 使用什么颜色以及放置它们的位置
    ColorBlend colorBlend = new ColorBlend(3);

    colorBlend.Positions = new float[3] { 0, 0.8f, 1 };
    colorBlend.Colors = new System.Drawing.Color[3]
    {
        System.Drawing.Color.FromArgb(0, System.Drawing.Color.White),
        System.Drawing.Color.FromArgb(heatPoint.Intensity, System.Drawing.Color.Black),
        System.Drawing.Color.FromArgb(heatPoint.Intensity, System.Drawing.Color.Black)
    };

    // 创建新的 PathGradientBrush 以使用圆周点创建径向渐变
    PathGradientBrush brush = new PathGradientBrush(pointsList.ToArray());
    // 将颜色混合传递给 PathGradientBrush 以指示它如何生成渐变
    brush.InterpolationColors = colorBlend;
    graphics.FillPolygon(brush, pointsList.ToArray());
    //brush.Dispose();
}

四、更新视图 

private void UpdateView()
{
    //灰度
    Bitmap bitmap1 = CreateIntensityMask(new Bitmap((int)panel1.Width, (int)panel1.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb), heatPoints, 1);
    panel1.BackgroundImage = bitmap1;

    //上色
    panel3.BackgroundImage = Colorize(bitmap1);
}

private Bitmap CreateIntensityMask(Bitmap bitmap, List<HeatPoint> aHeatPoints)
{
    //从Bitmap获得Graphics GDI+ 绘图图面
    Graphics graphics = Graphics.FromImage(bitmap);
    //清除整个绘图面并以白色填充
    graphics.Clear(System.Drawing.Color.White);
    foreach (HeatPoint point in aHeatPoints)
    {
       DrawHeatPoint2(graphics, point);
    }
    return bitmap;
} 

到此这篇关于C# .Net实现灰度图和HeatMap热力图winform(进阶)的文章就介绍到这了,更多相关C# .Net 灰度图 热力图内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python 对一幅灰度图像进行直方图均衡化

    from PIL import Image from pylab import * from numpy import * def histeq(im,nbr_bins = 256): """对一幅灰度图像进行直方图均衡化""" #计算图像的直方图 #在numpy中,也提供了一个计算直方图的函数histogram(),第一个返回的是直方图的统计量,第二个为每个bins的中间值 imhist,bins = histogram(im.flatten(

  • C#实现简易灰度图和酷炫HeatMap热力图winform(附DEMO)

    目录 一.效果展示 二.随机生成热力点 三.灰度图生成解析 四.热力图生成解析 五.源码下载 一.效果展示 二.随机生成热力点 热力点类 class HeatPoint { public int X; public int Y; public byte Intensity; public HeatPoint(int iX, int iY, byte bIntensity) { X = iX; Y = iY; Intensity = bIntensity; } } 随机生成热力点 privatev

  • C语言实现BMP图像处理(彩色图转灰度图)

    我们知道真彩图不带调色板,每个象素用 3 个字节,表示 R.G.B 三个分量.所以处理很简单,根据 R.G.B 的值求出 Y 值后,将 R.G.B 值都赋值成 Y,写入新图即可. 在YUV 的颜色表示方法中,Y 分量的物理含义就是亮度,它含了灰度图(grayscale)的所有信息,只用 Y 分量就完全能够表示出一幅灰度图来.YUV 和RGB 之间有着如下的对应关系: 再来看看带调色板的彩色图,我们知道位图中的数据只是对应调色板中的一个索引值,我们只需要将调色板中的彩色变成灰度,形成新调色板,而位

  • pytorch 彩色图像转灰度图像实例

    pytorch 库 pytorch 本身具有载入cifar10等数据集的函数,但是载入的是3*200*200的张量,当碰到要使用灰度图像时,可以使用他本身的函数进行修改,以较快速的完成彩色图像转灰度图像 pytorch函数 dataset = dset.CIFAR10(root='../train/data', download=True,transform=transforms.Compose([ transforms.Scale(200), transforms.ToTensor(), tr

  • C语言实现将彩色bmp图像转化为灰图、灰度图像反色

    本文实例为大家分享了C语言实现将彩色bmp图像转化为灰图.灰度图像反色的具体代码,供大家参考,具体内容如下 彩色图像转灰度图像 彩色(24位)bmp图像结构: typedef struct{ bitmapFileHeader bfHeader; bitmapInfoHeader biHeader; unsigned char *imgData; }bmp; 灰度(8位)bmp图像结构: typedef struct{ bitmapFileHeader bfHeader; bitmapInfoHe

  • C++基于灰度图上色GrayToColorFromOther的实现

    目录 场景需求 功能函数代码 C++测试代码 场景需求 之前有提到给灰度图上色的需求,在此基础上,还有一种需求,就是基于另一张参考灰度图的色板来给当前的灰度图上色,比如参考灰度图的数值区间为-10到10,颜色从蓝到绿再到红,而当前的灰度图的数据区间为-1到1,若基于参考灰度图的色板确定数据对应的颜色,则当前灰度图的颜色应该在绿色左右波动. 下方为具体实现函数和测试代码. 功能函数代码 /** * @brief GrayToColorFromOther 灰度图上色,基于参考灰度图的色板 * @pa

  • Python-numpy实现灰度图像的分块和合并方式

    我就废话不多说了,直接上代码吧! from numpy import * import numpy as np import cv2, os, math, os.path from PIL import Image base="F:\\Spy_CNN\\pythonCode\\cvSPY\\cvTest\\LBP\\LBPImag3\\" base2="F:\\ProgrameCode\\FaceDataLib\\orl_Arry\\" imageOld=cv2.i

  • C# .Net实现灰度图和HeatMap热力图winform(进阶)

    目录 一.前文 二.渐进颜色调色板 三.热力点大小和扩展大小 一.前文 前文可以参考我的前一篇博文:C# .Net实现简易灰度图和酷炫HeatMap热力图winform 但是,先前的热力图效果,我并不满意.不满意的地方主要有三点: 热力图的颜色是通过一个调色板图片来实现,如果想要其他颜色,改起来比较麻烦 热力图的扩散效果不好看,不够渐进 热力图的每个点大小都一致,应该是大小不一才对 因此,我做了改进,上一个图是之前的效果,下一个图是改进后的效果 二.渐进颜色调色板 //创建调色板,颜色映射 pr

  • Android提高之使用NDK把彩图转换灰度图的方法

    一般而言在Android上使用JAVA实现彩图转换为灰度图,与J2ME上的实现方法类似,不过遇到频繁地转换或者是大图转换时,就必须使用NDK来提高速度了.本文主要通过JAVA和NDK这两种方式来分别实现彩图转换为灰度图,并给出速度的对比,供大家参考. 先来简单地介绍一下Android的NDK使用步骤: 以NDK r4为例,或许以后新版的NDK的使用方法略有不同. 1.下载支持C++的android-ndk-r4-crystax,支持C++的话可玩性更强. 2.下载cygwin,选择ftp://m

  • Android-如何将RGB彩色图转换为灰度图方法介绍

    实例:RGB2Grey 项目运行效果图:          源代码: [java] public class MainActivity extends Activity { /* (non-Javadoc)     * @see android.app.Activity#onCreate(android.os.Bundle)     */     @Override     public void onCreate(Bundle savedInstanceState) {         sup

  • python opencv将图片转为灰度图的方法示例

    使用opencv将图片转为灰度图主要有两种方法,第一种是将彩色图转为灰度图,第二种是在使用OpenCV读取图片的时候直接读取为灰度图. 将彩色图转为灰度图 import cv2 import numpy as np if __name__ == "__main__": img_path = "timg.jpg" img = cv2.imread(img_path) #获取图片的宽和高 width,height = img.shape[:2][::-1] #将图片缩小

  • python实现彩色图转换成灰度图

    本文实例为大家分享了python实现彩色图转换成灰度图的具体代码,供大家参考,具体内容如下 from PIL import Image import os # 图像组成:红绿蓝 (RGB)三原色组成 亮度(255,255,255) image = "Annie1.jpg" img = Image.open(image) img_all = "素描" + image new = Image.new("L", img.size, 255) width

  • python中利用matplotlib读取灰度图的例子

    代码为: import matplotlib.pyplot as plt #用于显示图片 import matplotlib.image as mpimg # mpimg 用于读取图片 picdir = 'C:\\Users\\wyt\\Desktop\\test\\ship\\012400.jpg' img = mpimg.imread(picdir) plt.imshow(img) plt.title('Original train image') plt.show() 显示结果如下,是以热

  • python-OpenCV 实现将数组转换成灰度图和彩图

    主要步骤 1.生成普通python数组(bytearray(),os.urandom()) 2.转换成numpy数组(numpy.array()) 3.通过reshape将数组转换到所需的维数 4.以图像的形式显示出来(cv.imshow()) 代码 import os import cv2 as cv import numpy as np # Make an array of 120000 random bytes randomByteArray = bytearray(os.urandom(

  • Python读取图像并显示灰度图的实现

    python读取图像 原图: import cv2 # 利用opencv读取图像 import numpy as np # 利用matplotlib显示图像 import matplotlib.pyplot as plt img = cv2.imread("./lena.png") #读取图像 # 显示图像 plt.imshow(img) plt.axis('off') plt.show() 效果: 问:为什么画出的图像和原图有色差呢? 答:opencv的颜色通道顺序为[B,G,R],

随机推荐