获得图片色调工具类

图片色调识别 图片色调识别色调定义色调提取方法中位切分法RGB与色调 色调定义 (1) 暖色调 温暖与热烈是暖色的基调。当人们见到红、橙、黄、红紫等暖色调后, 比较容易联想到太阳、火焰、热血等事物,会有温暖、欢乐、刺激等感觉。 按照给人温暖感觉的强度有高到低排序: 橙色>红色>粉色>黄色>红紫色>黄绿色 例如暖色调的颜色占比达到40%以上,那么定义该图片的颜色为暖色调。 (2) 中性色调 没有冷暖性质的区别。比如灰、黑、棕属于中性色彩, 例如中性色调的颜色占比达到40%以上,那么 阅读详情

-

-

ColorThiefUtils.java

-

-

/*
 * Copyright (C) 2015 Henrique Rocha
 * Copyright (C) 2014 Fonpit AG
 *
 * License
 * -------
 * Creative Commons Attribution 2.5 License:
 * http://creativecommons.org/licenses/by/2.5/
 *
 * Thanks
 * ------
 * Simon Oualid - For creating java-colorthief
 * available at https://github.com/soualid/java-colorthief
 *
 * Lokesh Dhakar - for the original Color Thief javascript version
 * available at http://lokeshdhakar.com/projects/color-thief/
 *
 */

package com.library.util;

import android.graphics.Bitmap;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 获得图片色调工具类
 * Created by zsw on 2016/7/4.
 */
public class ColorThiefUtils {

    private static final int SIGBITS = 5;
    private static final int RSHIFT = 8 - SIGBITS;
    private static final int MAX_ITERATIONS = 1000;
    private static final double FRACT_BY_POPULATION = 0.75;

    private static final int RED = 0;
    private static final int GREEN = 1;
    private static final int BLUE = 2;

    public static List<int[]> compute(Bitmap image, int maxcolors) throws IOException {
        List<int[]> pixels = getPixels(image);
        return compute(pixels, maxcolors);
    }

    public static List<int[]> compute(List<int[]> pixels, int maxcolors) {
        ColorMap map = quantize(pixels, maxcolors);
        return map.palette();
    }

    private static List<int[]> getPixels(Bitmap image) {
        int width = image.getWidth();
        int height = image.getHeight();
        List<int[]> res = new ArrayList<>();
        List<Integer> t = new ArrayList<>();
        for (int row = 0; row < height; row++) {
            for (int col = 0; col < width; col++) {
                if(!image.isRecycled())
                    t.add(image.getPixel(col, row));
            }
        }
        for (int i = 0; i < t.size(); i += 10) {
            int[] rr = new int[3];
            int argb = t.get(i);
            rr[0] = (argb >> 16) & 0xFF;
            rr[1] = (argb >> 8) & 0xFF;
            rr[2] = (argb) & 0xFF;
            if (!(rr[0] > 250 && rr[1] > 250 && rr[2] > 250)) {
                res.add(rr);
            }
        }
        return res;
    }

    private static int getColorIndex(int r, int g, int b) {
        return (r << (2 * SIGBITS)) + (g << SIGBITS) + b;
    }

    private static int[] histogram(List<int[]> pixels) {
        int[] histogram = new int[1 << (3 * SIGBITS)];

        for (int[] pixel : pixels) {
            int rval = pixel[0] >> RSHIFT;
            int gval = pixel[1] >> RSHIFT;
            int bval = pixel[2] >> RSHIFT;
            histogram[getColorIndex(rval, gval, bval)]++;
        }

        return histogram;
    }

    private static VBox vboxFromPixels(List<int[]> pixels, int[] histo) {
        int rmin = 1000000, rmax = 0, gmin = 1000000, gmax = 0, bmin = 1000000, bmax = 0, rval, gval, bval;
        for (int[] pixel : pixels) {
            rval = pixel[0] >> RSHIFT;
            gval = pixel[1] >> RSHIFT;
            bval = pixel[2] >> RSHIFT;
            if (rval < rmin)
                rmin = rval;
            else if (rval > rmax)
                rmax = rval;
            if (gval < gmin)
                gmin = gval;
            else if (gval > gmax)
                gmax = gval;
            if (bval < bmin)
                bmin = bval;
            else if (bval > bmax)
                bmax = bval;
        }
        return new VBox(rmin, rmax, gmin, gmax, bmin, bmax, histo);
    }

    private static VBox[] medianCutApply(int[] histo, VBox vbox) {
        if (vbox.count(false) == 0)
            return null;
        if (vbox.count(false) == 1) {
            return new VBox[]{vbox.copy()};
        }
        int rw = vbox.r2 - vbox.r1 + 1, gw = vbox.g2 - vbox.g1 + 1, bw = vbox.b2 - vbox.b1 + 1, maxw = Math.max(Math.max(rw, gw), bw);

        int total = 0;
        List<Integer> partialsum = new ArrayList<>();
        List<Integer> lookaheadsum = new ArrayList<>();

        if (maxw == rw) {
            for (int i = vbox.r1; i <= vbox.r2; i++) {
                int sum = 0;
                for (int j = vbox.g1; j <= vbox.g2; j++) {
                    for (int k = vbox.b1; k <= vbox.b2; k++) {
                        sum += histo[getColorIndex(i, j, k)];
                    }
                }
                total += sum;
                if (partialsum.size() < i) {
                    int toAdd = i - partialsum.size();
                    for (int l = partialsum.size(); l < toAdd; l++) {
                        partialsum.add(0);
                    }
                }
                partialsum.add(i, total);
            }
        } else if (maxw == gw) {
            for (int i = vbox.g1; i <= vbox.g2; i++) {
                int sum = 0;
                for (int j = vbox.r1; j <= vbox.r2; j++) {
                    for (int k = vbox.b1; k <= vbox.b2; k++) {
                        sum += histo[getColorIndex(j, i, k)];
                    }
                }
                total += sum;
                if (partialsum.size() < i) {
                    int toAdd = i - partialsum.size();
                    for (int l = partialsum.size(); l < toAdd; l++) {
                        partialsum.add(0);
                    }
                }
                partialsum.add(i, total);
            }
        } else {
            for (int i = vbox.b1; i <= vbox.b2; i++) {
                int sum = 0;
                for (int j = vbox.r1; j <= vbox.r2; j++) {
                    for (int k = vbox.g1; k <= vbox.g2; k++) {
                        sum += histo[getColorIndex(j, k, i)];
                    }
                }
                total += sum;
                if (partialsum.size() < i) {
                    int toAdd = i - partialsum.size();
                    for (int l = partialsum.size(); l < toAdd; l++) {
                        partialsum.add(0);
                    }
                }
                partialsum.add(i, total);
            }
        }

        for (int i = 0; i < partialsum.size(); i++) {
            lookaheadsum.add(i, total - partialsum.get(i));
        }

        return maxw == rw
                ? doCut(RED, vbox, partialsum, lookaheadsum, total)
                : maxw == gw
                ? doCut(GREEN, vbox, partialsum, lookaheadsum, total)
                : doCut(BLUE, vbox, partialsum, lookaheadsum, total);
    }

    private static VBox[] doCut(int color, VBox vbox, List<Integer> partialsum, List<Integer> lookaheadsum, int total) {
        int dim1 = 0, dim2 = 0;
        if (color == RED) {
            dim1 = vbox.getR1();
            dim2 = vbox.getR2();
        } else if (color == GREEN) {
            dim1 = vbox.getG1();
            dim2 = vbox.getG2();
        } else if (color == BLUE) {
            dim1 = vbox.getB1();
            dim2 = vbox.getB2();
        }
        VBox vbox1, vbox2;
        int left, right, d2;
        Integer count2;
        for (int i = dim1; i < dim2; i++) {
            if (partialsum.get(i) > total / 2) {
                vbox1 = vbox.copy();
                vbox2 = vbox.copy();
                left = i - dim1;
                right = dim2 - i;
                if (left <= right) {
                    d2 = Math.min(dim2 - 1, ~~(i + right / 2));
                } else {
                    d2 = Math.max(dim1, ~~(i - 1 - left / 2));
                }
                while (partialsum.get(d2) == null)
                    d2++;
                count2 = lookaheadsum.get(d2);
                while (count2 == null && partialsum.get(d2 - 1) == null)
                    count2 = lookaheadsum.get(--d2);
                if (color == RED) {
                    vbox1.setR2(d2);
                    vbox2.setR1(vbox1.getR2() + 1);
                } else if (color == GREEN) {
                    vbox1.setG2(d2);
                    vbox2.setG1(vbox1.getG2() + 1);
                } else if (color == BLUE) {
                    vbox1.setB2(d2);
                    vbox2.setB1(vbox1.getB2() + 1);
                }
                return new VBox[]{vbox1, vbox2};
            }
        }
        return null;
    }

    @SuppressWarnings("unchecked")
    private static ColorMap quantize(List<int[]> pixels, int maxcolors) {
        if (pixels.size() == 0 || maxcolors < 2 || maxcolors > 256) {
            return null;
        }
        int[] histo = histogram(pixels);
        int nColors = 0;
        VBox vbox = vboxFromPixels(pixels, histo);
        List<VBox> pq = new ArrayList<>();
        pq.add(vbox);
        int niters = 0;
        Object[] r = iter(pq, FRACT_BY_POPULATION * maxcolors, histo, nColors, niters);
        pq = (List<VBox>) r[0];
        nColors = (Integer) r[1];
        niters = (Integer) r[2];
        Collections.sort(pq);
        r = iter(pq, maxcolors - pq.size(), histo, nColors, niters);
        pq = (List<VBox>) r[0];
        ColorMap cmap = new ColorMap();
        for (VBox vBox2 : pq) {
            cmap.push(vBox2);
        }
        return cmap;
    }

    private static Object[] iter(List<VBox> lh, double target, int[] histo, int nColors, int niters) {
        VBox vbox;
        while (niters < MAX_ITERATIONS) {
            vbox = lh.get(lh.size() - 1);
            lh.remove(lh.size() - 1);
            if (vbox.count(false) == 0) {
                lh.add(vbox);
                niters++;
                continue;
            }
            VBox[] vboxes = medianCutApply(histo, vbox);

            VBox vbox1 = vboxes[0];
            VBox vbox2 = vboxes[1];

            if (vbox1 == null)
                return new Object[]{lh, nColors, niters};
            lh.add(vbox1);
            if (vbox2 != null) {
                lh.add(vbox2);
                nColors++;
            }
            if (nColors >= target)
                return new Object[]{lh, nColors, niters};
            if (niters++ > MAX_ITERATIONS) {
                return new Object[]{lh, nColors, niters};
            }
            Collections.sort(lh);
        }
        return new Object[]{lh, nColors, niters};
    }

    static class VBox implements Comparable {
        private int r1;
        private int r2;
        private int g1;
        private int g2;
        private int b1;
        private int b2;
        private int[] avg;
        private Integer volume;
        private Integer count;
        private int[] histo;

        // r1: 0 / r2: 18 / g1: 0 / g2: 31 / b1: 0 / b2: 31
        public VBox(int r1, int r2, int g1, int g2, int b1, int b2, int[] histo) {
            super();
            this.r1 = r1;
            this.r2 = r2;
            this.g1 = g1;
            this.g2 = g2;
            this.b1 = b1;
            this.b2 = b2;
            this.histo = histo;
        }

        @Override
        public String toString() {
            return "r1: " + r1 + " / r2: " + r2 + " / g1: " + g1 + " / g2: " + g2 + " / b1: " + b1 + " / b2: " + b2 + "\n";
        }

        public int getVolume(boolean recompute) {
            if (volume == null || recompute) {
                volume = ((r2 - r1 + 1) * (g2 - g1 + 1) * (b2 - b1 + 1));
            }
            return volume;
        }

        public VBox copy() {
            return new VBox(r1, r2, g1, g2, b1, b2, histo);
        }

        public int[] avg(boolean recompute) {
            if (avg != null && !recompute) return avg;

            int ntot = 0;
            int mult = 1 << (8 - SIGBITS);
            int redSum = 0, greenSum = 0, blueSum = 0;
            int hval;

            for (int i = r1; i <= r2; i++) {
                for (int j = g1; j <= g2; j++) {
                    for (int k = b1; k <= b2; k++) {
                        hval = histo[getColorIndex(i, j, k)];
                        ntot += hval;
                        redSum += (hval * (i + 0.5) * mult);
                        greenSum += (hval * (j + 0.5) * mult);
                        blueSum += (hval * (k + 0.5) * mult);
                    }
                }
            }

            if (ntot > 0) {
                avg = new int[]{~~(redSum / ntot), ~~(greenSum / ntot), ~~(blueSum / ntot)};
            } else {
                avg = new int[]{~~(mult * (r1 + r2 + 1) / 2), ~~(mult * (g1 + g2 + 1) / 2), ~~(mult * (b1 + b2 + 1) / 2)};
            }

            return avg;
        }

        public int count(boolean recompute) {
            if (count != null && !recompute) return count;

            int npix = 0;
            for (int i = r1; i <= r2; i++) {
                for (int j = g1; j <= g2; j++) {
                    for (int k = b1; k <= b2; k++) {
                        int index = getColorIndex(i, j, k);
                        int g = histo[index];
                        npix += g;
                    }
                }
            }
            count = npix;

            return count;
        }

        public int getR1() {
            return r1;
        }

        public void setR1(int r1) {
            this.r1 = r1;
        }

        public int getR2() {
            return r2;
        }

        public void setR2(int r2) {
            this.r2 = r2;
        }

        public int getG1() {
            return g1;
        }

        public void setG1(int g1) {
            this.g1 = g1;
        }

        public int getG2() {
            return g2;
        }

        public void setG2(int g2) {
            this.g2 = g2;
        }

        public int getB1() {
            return b1;
        }

        public void setB1(int b1) {
            this.b1 = b1;
        }

        public int getB2() {
            return b2;
        }

        public void setB2(int b2) {
            this.b2 = b2;
        }

        @Override
        public int compareTo(Object o) {
            VBox anotherVBox = (VBox) o;
            return count(false) * getVolume(false) - anotherVBox.count(false) * anotherVBox.getVolume(false);
        }
    }

    static class ColorMap {
        private ArrayList<int[]> vboxes = new ArrayList<>();

        public void push(VBox box) {
            vboxes.add(0, box.avg(false));
        }

        public List<int[]> palette() {
            return vboxes;
        }

    }

}
iOS代码获取图片主色调 最近的开发过程中,有一个功能是根据银行的图标来确定cell的背景颜色,即获取图片的主色调。网上搜索了一些方法,发现有位博主分享了一个很好的代码方法,不过效果感觉不是特别明显,或者说变化不是很大,如图: 后来仔细想了一下,代码和方法是没有错误的,但是我们把透明颜色以及白色也计算进去了,所以效果才会那么不明显。所以在进行rgb色值获取的时候,排除掉透明色及白色即可,修改后的代码如下://根据图片 阅读详情

相关推荐

微信小程序-获取图片主色调

写在前面 是的我要开始做:根据图片的主色调来改变一下页面背景颜色了???? 记录一下,自己碰到的问题以及思考 时间多的话,会考虑将代码发在github,欢迎大家去star???? 开发准备 理一下思路 将网络图片绘制进canvas 通过canvas的getImageData获取图片的像素数据 canvas 2d 与旧版 canvas 将网络图片绘制进canvas的两种方法实践 分析目前主要用于...

Stay Awesome 6251

【亲测免费】 推荐一款神奇的图片色彩提取神器——Color Thief

在视觉设计领域,色彩搭配往往能决定作品的成败。而想要从图片中精准地抓取色彩灵感,Color Thief 就是你的得力助手。这款基于 JavaScript 的开源库,无论是在浏览器端还是 Node.js 环境下,都能轻松帮助你获取图像的调色板。 ## 项目介绍 Color Thief 是一个简洁且高效的工具,它能够让你直接从任何图像中提取主要颜色。它的设计目标是简单易用,并且可以在多种环境中运行...

gitblog_00506的博客 997

KMean clustering算法获取图片主色调

前几天在研究chromium代码的时候看到了一个取PNG图片主色调(dominant color)的算法,这个算法不是取图片中所有点的平均RGB值,也不是取同一RGB值最多的点的RGB。chromium中取图片主色调用的算法用的是 KMean clustering。可以算是KMean clustering的一个实际应用,chromium自己将其取名为RGB KMean Algorithm。

LisztLee的专栏 3857

ATTinyCore:经典AVR微控制器的现代化嵌入式开发框架

ATTinyCore作为经典AVR微控制器的终极Arduino兼容解决方案,重新定义了资源受限环境下的嵌入式开发体验。该项目为ATtiny 1634、828、x313、x4、x41、x5、x61、x7和x8系列提供了完整的Arduino生态系统支持,通过创新的虚拟引导加载器技术和优化的硬件抽象层,实现了在极小内存空间中的高效编程。核心创新在于其统一的API设计、差分ADC支持以及多引导加载器兼容性

gitblog_00572的博客 855

PHP实现图片主色调识别教程

PHP不仅能够用来创建动态网页和处理表单数据,还能通过GD库或Imagick扩展来处理图像。这些扩展提供了丰富的图像处理功能,包括但不限于图像创建、裁剪、旋转、滤镜应用以及格式转换等。在图像处理领域,主色调指的是图像中最为显著的颜色,它代表了图像的主要色彩特征。通过对主色调的研究与提取,可以在图像压缩、特征识别、内容分析等领域中发挥重要作用。具体而言,主色调是那些在视觉上占主导地位的颜色,这些颜色往往决定了人们对于图像的整体感受。

weixin_28487725的博客 882

图像主色调提取程序

基于MATLAB的图像主色调提取,可实现对图像的主色调的提取及显示

3个维度构建智能分析平台:从市场噪音到精准决策

在当今数据爆炸的时代,企业决策者面临的最大挑战不是数据匮乏,而是如何在信息洪流中识别真正有价值的信号。市场分析已从简单的数据收集演变为复杂的智能分析平台构建过程。Awesome Claude Skills通过循环迭代的"问题识别-方案构建-实施验证"框架,帮助企业构建**智能分析平台**,实现真正的**数据驱动决策**。 ## 如何从市场噪音中识别核心问题? 每个成功的市场分析始于对正确问题的

gitblog_00677的博客 729

基于opencv3.1库的JAVA源码

第1章 Java概述、安装及简易教学 14 1-1 Java概述 14 1-2 Java安装 16 1-3 Eclipse安装 18 1-4 GUI设计工具WindowBuilder 18 1-5 在Eclipse开发第一个Java程式 23 1-6 在Eclipse开发第一个Java视窗程式-显示影像 26 1-7 在Eclipse开发视窗程式-slider控制元件 34 1-8 在Eclipse开发视窗程式-按钮控制元件 39 1-9 好用的Eclipse热键 41 第2章 OpenCV概述、安装及设定 42 2-2 关于OpenCV 3.0及3.1 43 2-3 使用Java开发OpenCV的缺点 45 2-4 OpenCV的下载及安装 45 2-5 Eclipse设定OpenCV开发环境 46 2-6 整合Java之Eclipse与OpenCV 49 2-7 开发第一个OpenCV程式 51 2-8 建立矩阵 52 范例2-8-1 建立第一个opencv的矩阵,使用阵列 53 范例2-8-2 建立opencv的Mat矩阵方法2 55 范例2-8-3 方法3以单一元素指定 56 范例2-8-4 方法4全部以同一元素指定 57 范例2-8-5 方法5以个别单一元素指定 58 范例2-8-6 方法6以1维阵列指定建立 59 第3章 OpenCV基础数学计算 60 范例3-1-1 矩阵的线性代数计算1 60 范例3-1-2 矩阵的矩阵线性代数计算2-加减乘除处理 62 范例3-1-3 矩阵的矩阵线性代数计算3 65 范例3-2-1 矩阵的统计方面计算1 68 范例3-2-2矩阵的统计方面计算2 69 范例3-3-1 矩阵其他数学计算 72 第4章 影像基本输出输入处理 78 范例4-1-1 Opencv读取写入练习 79 范例4-1-2 Opencv读取影像并显示至视窗 81 范例4-1-3 Opencv读取影像显示至视窗-版本2 84 范例4-1-4影像储存压缩品质选择 87 范例4-2-1 Opencv使用webcam拍照,并存放置资料匣 89 范例4-2-2 使用webcam拍照明亮版-并存放影像在资料匣 90 范例4-2-3 使用webcam读取动态影像至Java Swing视窗 91 范例4-2-4 使用webcam读取动态影像至Java Swing视窗2 92 范例4-2-5 手动拍照 94 范例4-2-6 使用webcam录制影片档 96 范例4-2-7 使用xuggle录制电脑画面 99 范例4-2-8 使用Opencv API录制影片档案 102 范例4-3-1 Opencv API拨放影片档案,使用Panel 104 范例4-3-2 Opencv API拨放影片档案,不使用Panel 105 范例4-4-1从IPCam读取网路串流影像 107 范例4-4-2从IPCam拍摄照片 108 第5章 影像基本处理 109 范例5-1-1使用ConvertTo调整影像明亮度 109 范例5-1-2使用ConvertTo及GUI元件调整影像明暗度 110 范例5-1-3使用addWeighted及GUI元件调整影像明亮度 111 范例5-1-4改变影像的每1个像素调整影像明亮度 112 范例5-2-1全彩图转灰阶图 113 范例5-3-1影像颜色相反,使用Bitwise_xor 114 范例5-3-2影像颜色相反,使用subtract 115 范例5-3-3影像颜色相反,使用Bitwise_not 116 范例5-4-1模糊处理-使用Gaussian高斯函数及GUI元件 116 范例5-4-2修正5-4-1高斯模糊的异常 117 范例5-4-3模糊处理-使用median函数及GUI元件 118 范例5-4-4模糊处理-使用BoxFilter函数及GUI元件 119 范例5-5-1 Threshold-使用临界值函数及GUI元件 122 范例5-5-2 AdaptiveThreshold-使用自适临界值及GUI元件 128 范例5-6-1 Sharpness锐利化处理 130 范例5-6-2锐利化处理,使用GUI元件 131 范例5-7-1 影像合并/融合处理处理,使用GUI元件 131 范例5-8-1 影像缩放-使用Gaussian高斯金字塔及GUI元件 133 范例5-8-2影像缩放-使用resize使用GUI元件 135 范例5-8-3 影像延展效果-使用resize使用GUI元件 136 范例5-8-4影像缩放-使用getRotationMatrix2D及GUI元件 137 范例5-9-1影像旋转以90度*n为主-使用remap及 GUI元件 138 范例5-9-2影像旋转以90度*n为主-使用Flip及 GUI元件 140 范例5-9-3 影像可任意角度旋转缩放使用 GUI元件 141 范例5-10-1 影像扭曲倾斜处理使用GUI元件 143 范例5-11-1 灰阶影像对比强化处理并GUI显示 147 范例5-11-2 影像强化对比效果,使用均衡化直方图 149 范例5-11-3 RGB彩色强化对比效果,使用均衡化直方图及融合 150 范例5-11-4 YUV彩色强化对比效果,使用均衡化直方图及融合 151 范例5-12-1 影像梦幻沙龙处理使用GUI显示 152 范例5-13-1 影像各式颜色空间转换于GUI显示 154 范例5-14-1 影像堆叠 155 范例5-15-1 影像马赛克处理 157 范例5-16-1 影像添加外框 158 范例5-17-1合并两个影像 160 范例5-17-2合并两个影像,使用不规则形状 161 第6章 使用核矩阵进行影像处理 165 范例6-1-1 Mean filter处理 165 范例6-2-1 Prewitt Filter处理 167 范例6-3-1 Laplacian Filter处理1 170 范例6-3-2 Laplacian Filter处理2 171 范例6-3-3 Laplacian Filter灰阶影像处理 173 范例6-3-4 Laplacian Filter使用核矩阵 173 范例6-4-1 Sobel Filter使用核矩阵 175 范例6-4-2 Sobel Filter处理使用内建API 176 范例6-4-3 Sobel Filter处理使用内建API2 178 范例6-5-1 Frei Chenn Filter处理 180 范例6-6-1 Scharr Filter使用核矩阵 180 范例6-6-2 Scharr使用API 181 范例6-7-1 Robinson Filter处理 182 范例6-8-1 Kirsch Filter处理 184 范例6-9-1 Emboss浮雕处理 186 范例6-10-1 创造自己的filter 187 范例6-11-1 SqrBoxFilter处理 188 第7章 绘图 190 范例7-1-1 画线 190 范例7-2-1 画点 191 范例7-3-1 画圆 191 范例7-4-1 画椭圆形 192 范例7-4-2 椭圆内近似多边形练习 194 范例7-5-1 填补凸多边形练习 195 范例7-6-1 多边形绘图(填满)练习 196 范例7-6-2 多边形填充使用滑鼠练习 197 范例7-7-1中空多边形绘图练习 198 范例7-8-1 输入文字练习 200 范例7-8-2 输入文字使用中文练习 202 范例7-8-3浮水印练习 205 范例7-9-1 矩形练习 206 范例7-9-2 判断A矩形是否有在B矩形内 207 范例7-10-1 综合应用:直方图统计练习 208 范例7-11-1 颜色洪水填充处理练习1 211 范例7-11-2 颜色洪水填充处理练习2 213 范例7-11-3 颜色洪水填充处理3-重拾小朋友填色乐趣. 214 范例7-12-1 综合练习:使用一个最小矩形包含一堆点 215 范例7-13-1 综合练习:使用一个最小矩形包含一堆矩形 216 范例7-14-1 综合练习:使用一个矩形撷取影像区块 218 范例7-14-2综合练习:中空多边形绘制使用滑鼠 220 范例7-14-3综合练习:使用多边形撷取不规则影像区块1 222 范例7-14-4 综合练习:使用多边形撷取不规则影像区块2 227 范例7-14-5 综合练习:使用多边形撷取影像贴至另一影像 228 范例7-15-1箭头练习 232 范例7-16-1 特殊符号练习 233 范例7-17-1 立体浮雕制作 235 第8章 进阶影像处理 241 范例8-1-1 Erosion腐蚀处理练习 241 范例8-2-1 Dilation膨胀处理练习 242 范例8-3-1 其他形态学变换处理练习 244 范例8-4-1 Canny边缘检测处理练习1 246 范例8-4-2 Canny边缘检测处理练习2 248 范例8-5-1 卡通化处理1,整合模糊及Canny 249 范例8-5-2 卡通化处理2 252 范例8-5-3 卡通化及线条Live版 253 范例8-6-1 抠出背景处理练习 254 范例8-7-1聚光灯效果处理练习 256 范例8-9-1 分水岭演算法Watershed处理练习 258 范例8-10-1 油画效果处理练习 261 范例8-11-1 多种色调处理练习 262 范例8-12-1 圆形转矩形处理练习 266 范例8-13-1 LogPolar极座标转换处理 267 第9章 强大相片类处理 270 范例9-1-1 影像修复功能处理练习 270 范例9-2-1 影像减色/脱色/降灰阶处理练习 272 范例9-3-1 消除杂点练习1 273 范例9-3-2 消除杂点练习2 274 范例9-3-3 消除杂点练习3 275 范例9-3-4 消除杂点练习4 276 范例9-4-1 HDR高动态范围成像练习 277 范例9-5-1 Seamless Cloning系列 Color Change练习 285 范例9-6-1 Illumination Change练习 287 范例9-7-1 Texture Flattening水彩化 288 范例9-7-2 水彩的世界-Live版 290 范例9-8-1 Seamless Cloning系列-澄清湖水怪无缝贴图 290 范例9-8-2 Seamless Cloning系列-背景练习 295 范例9-8-3 综合练习:使用多边形撷取无缝贴图实作练习 296 范例9-9-1 Non-Photorealistic Rendering非实感绘制-强化 300 范例9-10-1 非实感绘制系列-模糊影像边缘保留处理 301 范例9-11-1 非实感绘制系列-铅笔处理 302 范例9-12-1 非实感绘制系列-写实风格化 304 范例9-12-2 写实风格化Live版 305 范例9-13-1 具限制性对比度自适应直方图均衡CLAHE 306 范例9-14-1 影像形状自动校正 308 范例9-14-2 影像角度自动校正 311 第10章 检测 314 范例10-1-1 Hough Line霍夫线变换1 314 范例10-1-2 Hough Line霍夫线变换2 317 范例10-1-3线段检测 319 范例10-2-1 Hough Circle霍夫圆变换 321 范例10-2-2霍夫圆变换应用:距离量测使用Cam实作 324 范例10-2-3 综合应用-虚拟画笔Live版1 327 范例10-2-4 虚拟画笔Live版2 330 范例10-3-1 寻找轮廓 332 范例10-3-2 轮廓顺序表示法 334 范例10-4-1 寻找轮廓并且绘出外框矩形1 336 范例10-4-2 寻找轮廓并且绘出外框矩形2 338 范例10-4-3 多点绘出外框矩形1 341 范例10-4-4 多点绘出外框矩形2 342 范例10-4-5 多点绘出外框凸多边形 343 范例10-4-6 绘出多点外框圆形 345 范例10-4-7 绘出多点外框椭圆形 346 范例10-4-8 最近似外框多边形 347 范例10-4-9 绘出多点最适外框三角形 349 范例10-5-1寻找轮廓并且绘出外框圆形 351 范例10-5-2寻找轮廓并且绘出外框椭圆形 352 范例10-5-3寻找轮廓并且绘出外框三角形 354 范例10-6-1判断某点是否在凸边形的轮廓内 356 范例10-7-1计算轮廓的面积与周长 357 范例10-8-1使用匹配模板找出某物 359 范例10-8-2使用非匹配模板找出某物 363 范例10-8-3 修正使用匹配与非匹配模板找出某物 364 范例10-9-1 convexHull凸包处理 367 范例10-10-1 convexityDefects凸包缺陷 369 范例10-11-1颜色区域检测 373 范例10-12-1颜色辨识-反向投影1 377 范例10-12-2颜色辨识-反向投影2 379 范例10-12-3颜色辨识-反向投影3 380 范例10-13-1颜色辨识以RGB为主 381 范例10-13-2颜色辨识,使用HSV彩色空间 382 范例10-13-3影像颜色检测 384 范例10-14-1从webcam读取影像及判断HSV颜色值 385 范例10-14-2读取影像及调整HSV颜色值捕捉物体 387 范例10-14-3计算生锈面积 389 范例10-15-1综合应用,辨识蓝色圆形物 390 范例10-15-2综合应用:辨识蓝色圆形物-增加膨胀以改良 393 范例10-16-1找出肤色Live版 395 范例10-16-2找出肤色Live改善版 396 范例10-17-1手势、手指数目辨识 397 范例10-17-2手势控制相机先比5后比Ya(2指)触发自动拍照 406 范例10-18-1 Xray效果及找到手掌心 407 范例10-18-2找到手掌心 Live版 410 范例10-18-3找到掌心与手指 Live版 411 范例10-19-1 空间矩、中心矩、标准中心矩及Hu不变矩 411 范例10-19-2比较两个形状 416 范例10-19-3比较两个影像,使用直方图比对法 419 范例10-19-4找出某物整合MatchTemplete与compareHist 422 范例10-20-1 找出合适的切线 425 范例10-20-2 众点找出合适的切线 428 范例10-21-1束绳检测是否断裂1 430 范例10-21-2束绳检测是否断裂2 432 范例10-21-3束绳检测是否断裂3 433 范例10-22-1束绳检测是否偏斜1 435 范例10-22-2束绳检测是否偏斜2 437 范例10-22-3束绳检测是否偏斜3 439 范例10-23-1 综合应用:找出趋势图最高点 441 范例10-24-1寻找两个矩形的交叉点 442 范例10-25-1 捕抓萤幕画面 444 范例10-25-2找出应用程式在萤幕的位置-我的Word在那里 446 第11章 特征点检测 450 范例11-1-1 Shi-Tomasi角点检测方法 450 范例11-1-2利用角点检测找出particle-Live版 452 范例11-2-1 Harris-Stephens边缘检测方法 453 范例11-3-1更精确的角点检测 454 范例11-4-1特征点检测计算 457 范例11-5-1利用Features2D二维特征点寻找物体 462 范例11-5-2利用二维特征点SURF+FLANN寻找物体-Live版 468 范例11-5-3利用Features2D寻找近似物体 468 范例11-6-1利用二维特征点及Homography单映射寻找物体 472 范例11-6-2利用二维特征点及单映射寻找物体Live版 476 范例11-6-3利用二维特征点及单映射寻找近似物体 476 范例11-7-1客制化角点检测视窗 477 范例11-8-1寻找出棋盘格 480 范例11-8-2寻找出棋盘格Live版 483 范例11-9-1矫正镜头畸形 483 范例11-9-1利用矫正镜头制造艺术化扭曲影像 487 第12章 运动追踪motion tracking 489 范例12-1-1补捉动静Live版 489 范例12-2-1使用HOG特征进行行人检测 491 范例12-2-2行人检测Live版 494 范例12-3-1 Lucas-Kanade光流 494 范例12-3-2 Farneback光流 499 范例12-4-1使用MOG特征进行行人检测 502 范例12-4-2 MOG特征进行行人检测Live版 504 范例12-4-3使用KNN特征进行行人检测 505 范例12-4-4 KNN特征进行行人检测Live版 506 范例12-5-1使用Meanshift均值偏移寻找物体Live版 507 范例12-6-1使用CamShift人脸追踪Live版 509 范例12-7-1 Kalman Filter滤波,随机乱跑Live版 512 范例12-7-2 Kalman Filter滤波,追踪蓝色圆形Live版 516 范例12-8-1更新运动历史图像Live版 517 第13章 Machine Learning机器学习 523 范例13-1-1人脸辨识 524 范例13-1-2人脸辨识Live版 527 范例13-1-3人脸辨识含眼鼻Live版 527 范例13-1-4人脸眼鼻快速辨识Live版 529 范例13-1-5 整合应用:检测到眼睛自动添加眼镜Live版 531 范例13-1-6检测到眼睛自动添加半透明眼镜Live版 534 范例13-1-7检测行人 535 范例13-1-8检测车辆 537 范例13-1-9 DetectMultiScale3参数测试 538 范例13-1-10计算车流量 540 范例13-1-11 侦测RJ45网路头Live版 542 范例13-2-1 电脑小手写板程式Live版 549 范例13-2-1a手写数字的资料库 552 范例13-2-1b鸢尾花资料库 555 范例13-3-1常态贝叶斯分类器预测鸢尾花数据集 560 范例13-3-2常态贝叶斯分类器-预测手写数字 561 范例13-3-3常态贝叶斯分类器-预测手写数字Live版 563 范例13-4-1决策树Decision Trees预测鸢尾花数据集 565 范例13-4-2决策树-预测手写数字 569 范例13-4-3决策树-预测手写数字Live版 571 范例13-5-1最大期望值EM-预测鸢尾花数据集 572 范例13-5-2最大期望值-预测鸢尾花数据集二元分类 576 范例13-5-3最大期望值-预测鸢尾花数据集3类修改版 578 范例13-5-4最大期望值-预测手写数字 581 范例13-5-5最大期望值-预测手写数字(二元分类) 583 范例13-5-6最大期望值-预测手写数字Live版 586 范例13-6-1 Logistic回归-预测鸢尾花数据集 586 范例13-6-2 Logistic回归-预测手写数字 590 范例13-6-3 Logistic回归-预测手写数字,调整参数 593 范例13-6-4 Logistic回归-预测手写数字Live版 593 范例13-7-1 KNN-预测鸢尾花数据集 594 范例13-7-2 KNN-预测鸢尾花数据集2 597 范例13-7-3 KNN-预测手写数字 600 范例13-7-3 KNN-预测手写数字Live版 602 范例13-7-5 KNN-分类练习 602 范例13-8-1 随机森林-预测鸢尾花数据集 604 范例13-8-2随机森林-预测手写数字 607 范例13-8-3 随机森林-预测手写数字Live版 609 范例13-9-1 Boost分类-预测鸢尾花数据集 609 范例13-9-2 Boost分类-预测鸢尾花数据集2 612 范例13-9-3 Boost-预测手写数字 615 范例13-9-4 Boost-预测手写数字Live版 617 范例13-10-1 类神经网路-初声试啼小练习 618 范例13-10-2 类神经网路-预测鸢尾花数据集 623 范例13-10-3类神经网路-预测手写数字 625 范例13-10-4类神经网路-预测手写数字Live版 627 范例13-11-1 SVM-预测鸢尾花数据集 627 范例13-11-2 SVM预测手写数字 631 范例13-11-3 SVM预测手写数字Live版 633 范例13-11-4 SVM分类练习于2D平面 633 范例13-12-1 Kmean(K均值)简单分类 636 范例13-12-2 Kmean 1维数据分类 640 范例13-12-3 Kmean 2维数据分类 643 范例13-12-4 Kmean 应用于影像处理-减色处理 646 范例13-12-5 Kmean预测分类-鸢尾花数据集 648 范例13-12-6 Kmean预测分类-手写数字数据集 650 范例13-12-7 Kmean预测分类-手写数字Live版 652 范例13-13-1马氏距离 654 范例13-13-2马氏距离使用于-鸢尾花数据集 656 范例13-13-3马氏距离使用于-手写数字数据集 657 范例13-13-4修改马氏距离使用于-手写数字数据集 660 范例13-13-5修改马氏距离使用于-鸢尾花数据集 665 范例13-13-6修改版马氏距离使用于-预测手写数字Live版 666 范例13-14-1主成份分析PCA 671 范例13-14-2鸢尾花数据集使用PCA降维 673 范例13-14-3鸢尾花数据使用PCA降维整合Kmean聚类处理 675 范例13-14-4鸢尾花数据使用PCA降维整合Knn分类处理 678 范例13-14-5手写数字集使用PCA降维整合Kmean聚类处理 680 范例13-14-6 手写数字集使用PCA降维整合KNN及SVM分类 682 范例13-14-7 改善手写数字集使用PCA降维整合KNN及SVM 685 范例13-14-8 改善鸢尾花数据使用PCA降维整合KNN分类 689 范例13-14-9个人人脸辨识整合PCA与SVM计算 690 范例13-14-10个人人脸辨识整合PCA与LibSVM计算 694 范例13-15-0车牌辨识 699 范例13-15-1 Java呼叫外部命令Tesseract字符识别引擎 701 第14章 其它功能与整合效果 703 范例14-1-1离散傅立叶转换 703 范例14-2-1视差(视角不对称)使用BM 706 范例14-2-2视差(视角不对称)使用SGBM 708 范例14-3-1综合应用:虚拟钢琴Live版 710 范例14-4-1平面细分割使用Subdiv2D 711 范例14-4-2综合练习,平面细分割使用Subdiv2D应用于人脸 715 范例14-4-2综合练习,平面细分割应用人脸Live版 718 第15章 发行Java应用程式 721 第16章 Opencv与Web整合 723 范例16-1-1 Hello Opencv 723 范例16-1-2 利用opencv显示影像 726 范例16-1-3在Web上模糊处理 729 范例16-1-4 jsp应用模糊处理 730 附录A Opencv Mat资料结构列表 734 附录B Opencv色彩空间转换资料格式列表 736 附录C Iris鸢尾花数据集 743 附录D Opencv Java开发异常说明 748 附录E Opencv for Java 2.4.12与3.1差异 749 附录F Opencv相关网址 754

java获取图片的主色

package com.kuang.tryTo; import cn.hutool.core.img.ImgUtil; import java.awt.*; import java.awt.image.BufferedImage; import java.lang.management.ManagementFactory; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; impor

qq_45396088的博客 1774

java颜色取色器

能够获取鼠标所在位置的rgb值,同时也能够设置rgb值,查看颜色,其中代码在上传jar文件中,将jar文件解压即可

Java获取彩色图像中的主色彩的实例代码

主要介绍了Java获取彩色图像中的主色彩的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

ColorThief的介绍与使用

ColorThief插件介绍,获取图片颜色填充背景色示例

Jinuss的博客 1602

java处理图片背景颜色的方法

主要为大家详细介绍了java处理图片背景颜色的方法,蓝底寸照批量转换为白底,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在vue中获取图片的主色调

在vue中获取图片的主色调 (官方传送门:https://lokeshdhakar.com/projects/color-thief/) 本次仅讲局部引入的方式 html: <img :src="detailsImg" height="100" width="100" crossorigin="anonymous"/>//后面的属性允许获取网络上的图片 import ColorThi...

qq_38817549的博客 5265

从零构建DDS信号发生器:STM32 DAC与DMA的完美交响

本文详细介绍了如何利用STM32的DAC模块和DMA控制器从零构建高性能DDS信号发生器。通过深入解析DDS技术原理、STM32 DAC特性及DMA高效数据传输,提供了完整的波形生成算法、硬件电路设计和软件实现方案,帮助开发者掌握数字信号合成的核心技术。

tree8的博客 705

【OpenCV-Python】图像的载入、显示和输出(imread()、imshow()、waitKey()、namedWindow()、imwrite())

图像的载入:imread()函数 imread()函数可以用来非常便捷地读取文件中的图片到Opencv中。这个函数一般需要两个参数: (1)载入图片的路径名。如果图像文件在工程文件夹下,可以直接用文件名读取,如“cat.jpg”,否则需要输入完整的访问路径,如“D:\\test\\lena.png”。这里还有几个tips: imread函数中,一个点代表省略当前文件夹路径,两个点则代表回...

M&Q的博客 1397

Flutter如何获取图片主色调

虽然没有自己实现这个功能,但是这个过程学会了如何获取Flutter中图片的像素点,如何去计算RGB值,也算有所收获。也了解到了安卓中取色器的算法实现思路,最后通过color_thief_dart库实现了目标。希望这篇文章对你有所帮助。这里是甜瓜看代码,期待你的关注!

m0_69656288的博客 1675

Android13 SurfaceFlinger启动流程分析

在Android13版本中,SurfaceFlinger是由Android.bp去启动init.rc文件,然后再解析文件去加载SurfaceFlinger。上面方法主要处理如下:1、调用surfaceflinger的createSurfaceFlinger方法,实例化surfaceflinger。2、调用flinger(surfaceflinger)的init()方法,在客户端连接之前进行初始化。

liuning1985622的博客 1918

利用几种颜色量化方法提取图片颜色色调

利用几种颜色量化方法提取图片颜色色调 这里主要用3种方法:包含两种k-means方法和一种matlab自带的最小方差量化方法。 为了方便对比,文中选用梵高的星空(The Starry Night)作为提取图片。 1 k-means方法(在RGB空间) 颜色量化是指一个减少在图像中的颜色数量的压缩过程。旨在用尽可能少的颜色去还原图片。 所以,也可以用聚类方法去进行处理,即将所有颜色在色彩空间上分布开...

hyhhyh21的博客 1万+

基于Simulink的光储系统黑启动能力仿真

本文基于Simulink平台构建了光储系统黑启动仿真模型,详细阐述了储能VF控制、光伏孤岛MPPT和同步并网等核心控制策略。通过分阶段协调控制(储能启动→关键负载→光伏接入→非关键负载→同步并网),实现了60秒内恢复供电、母线电压波动<5%的性能指标。仿真结果表明,协调控制策略相比无序启动可显著提升系统稳定性,避免电压崩溃和负载跳闸。文章还提供了完整的建模步骤、核心代码及进阶优化方向,为微电网应急供电设计提供了实用参考。该模型适用于光伏储能系统的黑启动能力验证和优化研究。

amy_mhd的博客 106

Unity3D 加密 Assembly-CSharp.dll (Android平台) 防止反编译

0、加密的原理 Unity3D 是基于 Mono的,我们平时写的 C# 脚本都被编译到了 Assembly-CSharp.dll ,然后 再由 Mono 来加载、解析、然后执行。 Mono 加载 Assembly-CSharp.dll 的时候就是读取文件到内存中,和平时读取一个 游戏资源 文件没什么区别。 为了防止别人破解,我们会对游戏资源加密,简单点的 比如修改文件的一个字节 或者 位移一下

Circle 8719

Android Palette 提取图片的主色调

在 Android 应用开发中,经常会有这样的一种需求,就是状态栏的颜色要随着图片的切换,进行动态的设置颜色,而且此颜色要与图片相互融合,自然颜色不能太夸张,状态栏颜色与图片的主色调区别不能太大。 介于这种情况,Android SDK 给我们提供了这样的一个类:Palette 类,此类在 com.android.support 包下,我们要使用时,只需引入该包即可。引入方法如下: impl...

你若盛开,蜜蜂自来 4356

【系统架构设计师】预测试卷一:综合知识(75道选择题)

软件架构风格是描述某一特定应用领域中系统组织方式的惯用模式,架构风格反映领域中众多系统所共有的结构和 (48),强调对架构(49)的重用。 (48) A. 语义特性 B. 功能需求 C. 质量属性 D. 业务规则 (49) A. 分析 B. 设计 C.实现

数据知道的博客 7766

HDR图片以及色调映射(ToneMapping)

高动态范围(High-Dynamic Range,简称HDR),相应的,LDR(Low-Dynamic Range),也就是我们常见的8bit存储方式的图片.之前都是在介绍视频方面.但是在高动态图片(HDRI)方面也有一些少量应用, 目前常用的存储格式有三种:OpenEXR、RadianceRGBE、FloatTIFF. OpenEXR OpenEXR是由工业光魔(Industrial Light & Magic)开发的一种HDR标准。OpenEXR文件的扩展名为.exr,常...

qq26983255的博客 2万+

生成模型实战 | 基于Transformer生成音乐

本文介绍了基于Transformer架构的音乐生成方法,将音乐视为一系列事件序列进行处理。与将音乐表示为多维图像的MuseGAN不同,该方法使用类似GPT的仅解码器模型,基于先前事件预测下一个音乐事件。模型使用MIDI格式的钢琴音乐数据,通过分词处理将音符转换为note-on、note-off、time-shift和velocity四种事件类型,共388个独特词元,映射为索引序列后输入网络。训练完成后,可通过调整温度参数控制生成音乐的新颖性,从而创作出风格类似训练数据且连贯逼真的音乐作品。

盼小辉丶的博客 5788

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: 时间工具类
下一篇: dp与px转换工具类
Jusenr
博客等级 码龄10年 13粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值