相信看过冈萨雷斯第三版数字图像处理的童鞋都知道,里面涉及到了很多的基础图像处理的算法,今天,就专门借用其中一个混合空间增强的案例,来将常见的几种图像处理算法集合起来,看能发生什么样的化学反应

首先,通过一张图来看下,我们即将需要完成的工作目标

同时,我们也借用书中的人体全身骨骼图像来进行模拟实现这些算法,这样,我们可以通过和书中展示的效果来评判我们实现的算法是否正确,那接下来,我们就来一步一步的实现吧。

第一步:拉普拉斯锐化

这里就不讲解具体的原理了,拉普拉斯是一个二阶微分的算子,这样的算子通过和图像进行卷积操作,可以让我们得到图像中灰度突变区域,就是说那些不同颜色的交界处,下面看代码和运行效果图

public BufferedImage laplaceProcess(BufferedImage src) {// 拉普拉斯算子int[] LAPLACE = new int[] { 0, -1, 0, -1, 4, -1, 0, -1, 0 };int width = src.getWidth();int height = src.getHeight();int[] pixels = new int[width * height];int[] outPixels = new int[width * height];int type = src.getType();if (type == BufferedImage.TYPE_INT_ARGB|| type == BufferedImage.TYPE_INT_RGB) {src.getRaster().getDataElements(0, 0, width, height, pixels);}src.getRGB(0, 0, width, height, pixels, 0, width);int k0 = 0, k1 = 0, k2 = 0;int k3 = 0, k4 = 0, k5 = 0;int k6 = 0, k7 = 0, k8 = 0;k0 = LAPLACE[0];k1 = LAPLACE[1];k2 = LAPLACE[2];k3 = LAPLACE[3];k4 = LAPLACE[4];k5 = LAPLACE[5];k6 = LAPLACE[6];k7 = LAPLACE[7];k8 = LAPLACE[8];int offset = 0;int sr = 0, sg = 0, sb = 0;int r = 0, g = 0, b = 0;for (int row = 1; row < height - 1; row++) {offset = row * width;for (int col = 1; col < width - 1; col++) {// redsr = k0 * ((pixels[offset - width + col - 1] >> 16) & 0xff)+ k1 * ((pixels[offset - width + col] >> 16) & 0xff)+ k2* ((pixels[offset - width + col + 1] >> 16) & 0xff)+ k3 * ((pixels[offset + col - 1] >> 16) & 0xff) + k4* ((pixels[offset + col] >> 16) & 0xff) + k5* ((pixels[offset + col + 1] >> 16) & 0xff) + k6* ((pixels[offset + width + col - 1] >> 16) & 0xff)+ k7 * ((pixels[offset + width + col] >> 16) & 0xff)+ k8* ((pixels[offset + width + col + 1] >> 16) & 0xff);// greensg = k0 * ((pixels[offset - width + col - 1] >> 8) & 0xff) + k1* ((pixels[offset - width + col] >> 8) & 0xff) + k2* ((pixels[offset - width + col + 1] >> 8) & 0xff) + k3* ((pixels[offset + col - 1] >> 8) & 0xff) + k4* ((pixels[offset + col] >> 8) & 0xff) + k5* ((pixels[offset + col + 1] >> 8) & 0xff) + k6* ((pixels[offset + width + col - 1] >> 8) & 0xff) + k7* ((pixels[offset + width + col] >> 8) & 0xff) + k8* ((pixels[offset + width + col + 1] >> 8) & 0xff);// bluesb = k0 * (pixels[offset - width + col - 1] & 0xff) + k1* (pixels[offset - width + col] & 0xff) + k2* (pixels[offset - width + col + 1] & 0xff) + k3* (pixels[offset + col - 1] & 0xff) + k4* (pixels[offset + col] & 0xff) + k5* (pixels[offset + col + 1] & 0xff) + k6* (pixels[offset + width + col - 1] & 0xff) + k7* (pixels[offset + width + col] & 0xff) + k8* (pixels[offset + width + col + 1] & 0xff);r = sr;g = sg;b = sb;outPixels[offset + col] = (0xff << 24) | (clamp(r) << 16)| (clamp(g) << 8) | clamp(b);sr = 0;sg = 0;sb = 0;}}BufferedImage dest = new BufferedImage(width, height,BufferedImage.TYPE_INT_ARGB);if (type == BufferedImage.TYPE_INT_ARGB|| type == BufferedImage.TYPE_INT_RGB) {dest.getRaster().setDataElements(0, 0, width, height, outPixels);} else {dest.setRGB(0, 0, width, height, outPixels, 0, width);}return dest;}

注:左边是原图,右边是运行效果图,由于原图是比较‘缓和’的图片,可以看到拉普拉斯后,生成了一些点,而这些点对应到原图中的位置,正是灰度有突变的地方

紧接着,我们将原图和拉普拉斯锐化后的图进行相加操作,这样,我们就可以看到一样比较清晰的图了,下面是代码和运行效果

/** 拉普拉斯叠加原图像 **/public BufferedImage laplaceAddProcess(BufferedImage src) {// 拉普拉斯算子int[] LAPLACE = new int[] { 0, -1, 0, -1, 4, -1, 0, -1, 0 };int width = src.getWidth();int height = src.getHeight();int[] pixels = new int[width * height];int[] outPixels = new int[width * height];int type = src.getType();if (type == BufferedImage.TYPE_INT_ARGB|| type == BufferedImage.TYPE_INT_RGB) {src.getRaster().getDataElements(0, 0, width, height, pixels);}src.getRGB(0, 0, width, height, pixels, 0, width);int k0 = 0, k1 = 0, k2 = 0;int k3 = 0, k4 = 0, k5 = 0;int k6 = 0, k7 = 0, k8 = 0;k0 = LAPLACE[0];k1 = LAPLACE[1];k2 = LAPLACE[2];k3 = LAPLACE[3];k4 = LAPLACE[4];k5 = LAPLACE[5];k6 = LAPLACE[6];k7 = LAPLACE[7];k8 = LAPLACE[8];int offset = 0;int sr = 0, sg = 0, sb = 0;int r = 0, g = 0, b = 0;for (int row = 1; row < height - 1; row++) {offset = row * width;for (int col = 1; col < width - 1; col++) {r = (pixels[offset + col] >> 16) & 0xff;g = (pixels[offset + col] >> 8) & 0xff;b = (pixels[offset + col]) & 0xff;// redsr = k0 * ((pixels[offset - width + col - 1] >> 16) & 0xff)+ k1 * ((pixels[offset - width + col] >> 16) & 0xff)+ k2* ((pixels[offset - width + col + 1] >> 16) & 0xff)+ k3 * ((pixels[offset + col - 1] >> 16) & 0xff) + k4* ((pixels[offset + col] >> 16) & 0xff) + k5* ((pixels[offset + col + 1] >> 16) & 0xff) + k6* ((pixels[offset + width + col - 1] >> 16) & 0xff)+ k7 * ((pixels[offset + width + col] >> 16) & 0xff)+ k8* ((pixels[offset + width + col + 1] >> 16) & 0xff);// greensg = k0 * ((pixels[offset - width + col - 1] >> 8) & 0xff) + k1* ((pixels[offset - width + col] >> 8) & 0xff) + k2* ((pixels[offset - width + col + 1] >> 8) & 0xff) + k3* ((pixels[offset + col - 1] >> 8) & 0xff) + k4* ((pixels[offset + col] >> 8) & 0xff) + k5* ((pixels[offset + col + 1] >> 8) & 0xff) + k6* ((pixels[offset + width + col - 1] >> 8) & 0xff) + k7* ((pixels[offset + width + col] >> 8) & 0xff) + k8* ((pixels[offset + width + col + 1] >> 8) & 0xff);// bluesb = k0 * (pixels[offset - width + col - 1] & 0xff) + k1* (pixels[offset - width + col] & 0xff) + k2* (pixels[offset - width + col + 1] & 0xff) + k3* (pixels[offset + col - 1] & 0xff) + k4* (pixels[offset + col] & 0xff) + k5* (pixels[offset + col + 1] & 0xff) + k6* (pixels[offset + width + col - 1] & 0xff) + k7* (pixels[offset + width + col] & 0xff) + k8* (pixels[offset + width + col + 1] & 0xff);// 运算后的像素值和原图像素叠加r += sr;g += sg;b += sb;outPixels[offset + col] = (0xff << 24) | (clamp(r) << 16)| (clamp(g) << 8) | clamp(b);// next pixelr = 0;g = 0;b = 0;}}BufferedImage dest = new BufferedImage(width, height,BufferedImage.TYPE_INT_ARGB);if (type == BufferedImage.TYPE_INT_ARGB|| type == BufferedImage.TYPE_INT_RGB) {dest.getRaster().setDataElements(0, 0, width, height, outPixels);} else {dest.setRGB(0, 0, width, height, outPixels, 0, width);}return dest;}

同样,左边是原图,右边是原图和经拉普拉斯锐化后相叠加的图,比原图感觉更亮一点了,因为灰度突变的地方加强了

第二步:Sobel提取边缘

接下来,我们还是继续针对原图进行处理,我们想提取原图的边缘,Sobel是一阶算子,结果和图像卷积运算后,可以提取到图像的边缘信息,同样,下面给出代码和运行效果

public BufferedImage sobelProcess(BufferedImage src) {// Sobel算子int[] sobel_y = new int[] { -1, -2, -1, 0, 0, 0, 1, 2, 1 };int[] sobel_x = new int[] { -1, 0, 1, -2, 0, 2, -1, 0, 1 };int width = src.getWidth();int height = src.getHeight();int[] pixels = new int[width * height];int[] outPixels = new int[width * height];int type = src.getType();if (type == BufferedImage.TYPE_INT_ARGB|| type == BufferedImage.TYPE_INT_RGB) {src.getRaster().getDataElements(0, 0, width, height, pixels);}src.getRGB(0, 0, width, height, pixels, 0, width);int offset = 0;int x0 = sobel_x[0];int x1 = sobel_x[1];int x2 = sobel_x[2];int x3 = sobel_x[3];int x4 = sobel_x[4];int x5 = sobel_x[5];int x6 = sobel_x[6];int x7 = sobel_x[7];int x8 = sobel_x[8];int k0 = sobel_y[0];int k1 = sobel_y[1];int k2 = sobel_y[2];int k3 = sobel_y[3];int k4 = sobel_y[4];int k5 = sobel_y[5];int k6 = sobel_y[6];int k7 = sobel_y[7];int k8 = sobel_y[8];int yr = 0, yg = 0, yb = 0;int xr = 0, xg = 0, xb = 0;int r = 0, g = 0, b = 0;for (int row = 1; row < height - 1; row++) {offset = row * width;for (int col = 1; col < width - 1; col++) {// redyr = k0 * ((pixels[offset - width + col - 1] >> 16) & 0xff)+ k1 * ((pixels[offset - width + col] >> 16) & 0xff)+ k2* ((pixels[offset - width + col + 1] >> 16) & 0xff)+ k3 * ((pixels[offset + col - 1] >> 16) & 0xff) + k4* ((pixels[offset + col] >> 16) & 0xff) + k5* ((pixels[offset + col + 1] >> 16) & 0xff) + k6* ((pixels[offset + width + col - 1] >> 16) & 0xff)+ k7 * ((pixels[offset + width + col] >> 16) & 0xff)+ k8* ((pixels[offset + width + col + 1] >> 16) & 0xff);xr = x0 * ((pixels[offset - width + col - 1] >> 16) & 0xff)+ x1 * ((pixels[offset - width + col] >> 16) & 0xff)+ x2* ((pixels[offset - width + col + 1] >> 16) & 0xff)+ x3 * ((pixels[offset + col - 1] >> 16) & 0xff) + x4* ((pixels[offset + col] >> 16) & 0xff) + x5* ((pixels[offset + col + 1] >> 16) & 0xff) + x6* ((pixels[offset + width + col - 1] >> 16) & 0xff)+ x7 * ((pixels[offset + width + col] >> 16) & 0xff)+ x8* ((pixels[offset + width + col + 1] >> 16) & 0xff);// greenyg = k0 * ((pixels[offset - width + col - 1] >> 8) & 0xff) + k1* ((pixels[offset - width + col] >> 8) & 0xff) + k2* ((pixels[offset - width + col + 1] >> 8) & 0xff) + k3* ((pixels[offset + col - 1] >> 8) & 0xff) + k4* ((pixels[offset + col] >> 8) & 0xff) + k5* ((pixels[offset + col + 1] >> 8) & 0xff) + k6* ((pixels[offset + width + col - 1] >> 8) & 0xff) + k7* ((pixels[offset + width + col] >> 8) & 0xff) + k8* ((pixels[offset + width + col + 1] >> 8) & 0xff);xg = x0 * ((pixels[offset - width + col - 1] >> 8) & 0xff) + x1* ((pixels[offset - width + col] >> 8) & 0xff) + x2* ((pixels[offset - width + col + 1] >> 8) & 0xff) + x3* ((pixels[offset + col - 1] >> 8) & 0xff) + x4* ((pixels[offset + col] >> 8) & 0xff) + x5* ((pixels[offset + col + 1] >> 8) & 0xff) + x6* ((pixels[offset + width + col - 1] >> 8) & 0xff) + x7* ((pixels[offset + width + col] >> 8) & 0xff) + x8* ((pixels[offset + width + col + 1] >> 8) & 0xff);// blueyb = k0 * (pixels[offset - width + col - 1] & 0xff) + k1* (pixels[offset - width + col] & 0xff) + k2* (pixels[offset - width + col + 1] & 0xff) + k3* (pixels[offset + col - 1] & 0xff) + k4* (pixels[offset + col] & 0xff) + k5* (pixels[offset + col + 1] & 0xff) + k6* (pixels[offset + width + col - 1] & 0xff) + k7* (pixels[offset + width + col] & 0xff) + k8* (pixels[offset + width + col + 1] & 0xff);xb = x0 * (pixels[offset - width + col - 1] & 0xff) + x1* (pixels[offset - width + col] & 0xff) + x2* (pixels[offset - width + col + 1] & 0xff) + x3* (pixels[offset + col - 1] & 0xff) + x4* (pixels[offset + col] & 0xff) + x5* (pixels[offset + col + 1] & 0xff) + x6* (pixels[offset + width + col - 1] & 0xff) + x7* (pixels[offset + width + col] & 0xff) + x8* (pixels[offset + width + col + 1] & 0xff);// 索贝尔梯度r = (int) Math.sqrt(yr * yr + xr * xr);g = (int) Math.sqrt(yg * yg + xg * xg);b = (int) Math.sqrt(yb * yb + xb * xb);outPixels[offset + col] = (0xff << 24) | (clamp(r) << 16)| (clamp(g) << 8) | clamp(b);}}BufferedImage dest = new BufferedImage(width, height,BufferedImage.TYPE_INT_ARGB);if (type == BufferedImage.TYPE_INT_ARGB|| type == BufferedImage.TYPE_INT_RGB) {dest.getRaster().setDataElements(0, 0, width, height, outPixels);} else {dest.setRGB(0, 0, width, height, outPixels, 0, width);}return dest;}

注:左边是原图,右边是经过Sobel变换后的图,从图中可以明显看到Sobel达到的效果

第三步:均值滤波

这一步需要在Sobel变换后得到的图像基础上进行进一步的变换,均值滤波,就是将图像中每一点的像素值用其周边多个像素值的平均值重新赋值,有3*3,5*5的滤波器,我们即将使用的是5*5的滤波器,即是说,将某一个像素点重新赋值为以其为中心的25的像素值的平均值,下面我们看下代码和运行效果

/** 均值滤波 **/public BufferedImage meanValueProcess(BufferedImage src) {BufferedImage image = this.sobelProcess(src);// 已经索贝尔处理的图像int width = image.getWidth();int height = image.getHeight();int[] pixels = new int[width * height];int[] outPixels = new int[width * height];int type = image.getType();if (type == BufferedImage.TYPE_INT_ARGB|| type == BufferedImage.TYPE_INT_RGB) {image.getRaster().getDataElements(0, 0, width, height, pixels);}image.getRGB(0, 0, width, height, pixels, 0, width);// 均值滤波使用的卷积模板半径,这里使用5*5均值,所以半径使用2int radius = 2;int total = (2 * radius + 1) * (2 * radius + 1);int r = 0, g = 0, b = 0;for (int row = 0; row < height; row++) {for (int col = 0; col < width; col++) {int sum = 0;for (int i = -radius; i <= radius; i++) {int roffset = row + i;roffset = (roffset < 0) ? 0: (roffset >= height ? height - 1 : roffset);for (int j = -radius; j <= radius; j++) {int coffset = col + j;coffset = (coffset < 0) ? 0: (coffset >= width ? width - 1 : coffset);int pixel = pixels[roffset * width + coffset];r = (pixel >> 16) & 0XFF;sum += r;}}r = sum / total;g = sum / total;b = sum / total;outPixels[row * width + col] = (255 << 24) | (clamp(r) << 16)| (clamp(g) << 8) | clamp(b);}}BufferedImage dest = new BufferedImage(width, height,BufferedImage.TYPE_INT_ARGB);if (type == BufferedImage.TYPE_INT_ARGB|| type == BufferedImage.TYPE_INT_RGB) {dest.getRaster().setDataElements(0, 0, width, height, outPixels);} else {dest.setRGB(0, 0, width, height, outPixels, 0, width);}return dest;}

注:左边是原图,右边是经Sobel变换后再经5*5均值滤波变换的效果,我们可以看到,均值滤波有模糊的效果

第四步:数学变换

在进行伽马变换之前,我们需要将经拉普拉斯锐化后的图像和经Sobel及均值滤波后得到的图像进行相乘,此外,还要和原图进行相加,经过这些数学变化后的图像,再进行伽马变化,下面先给出这些数学变化的代码和效果图

/** 数学运算*/public BufferedImage mathProcess(BufferedImage src) {// 获取经拉普拉斯运算后与原图叠加的图片BufferedImage lapsImage = this.laplaceAddProcess(src);// 获取索贝尔5*5均值滤波后的图像BufferedImage meanImage = this.meanValueProcess(src);int type = src.getType();int width = src.getWidth();int height = src.getHeight();// 原始图像的像素信息int[] pixels = new int[width * height];if (type == BufferedImage.TYPE_INT_ARGB|| type == BufferedImage.TYPE_INT_RGB) {src.getRaster().getDataElements(0, 0, width, height, pixels);}src.getRGB(0, 0, width, height, pixels, 0, width);// 拉普拉斯锐化后的像素信息int[] lapsPixels = new int[width * height];if (type == BufferedImage.TYPE_INT_ARGB|| type == BufferedImage.TYPE_INT_RGB) {lapsImage.getRaster().getDataElements(0, 0, width, height,lapsPixels);}lapsImage.getRGB(0, 0, width, height, lapsPixels, 0, width);// Sobel和均值滤波后的像素信息int[] meanPixels = new int[width * height];if (type == BufferedImage.TYPE_INT_ARGB|| type == BufferedImage.TYPE_INT_RGB) {meanImage.getRaster().getDataElements(0, 0, width, height,meanPixels);}meanImage.getRGB(0, 0, width, height, meanPixels, 0, width);int[] outPixels = new int[width * height];// 图像相乘int lr = 0, lg = 0, lb = 0;int mr = 0, mg = 0, mb = 0;int or = 0, og = 0, ob = 0;int r = 0, g = 0, b = 0;for (int row = 0; row < height; row++) {for (int col = 0; col < width; col++) {int lpixel = lapsPixels[row * width + col];int mpixel = meanPixels[row * width + col];// 原始图像int opixel = pixels[row * width + col];lr = (lpixel >> 16) & 0XFF;mr = (mpixel >> 16) & 0XFF;or = (opixel >> 16) & 0XFF;lg = (lpixel >> 8) & 0XFF;mg = (mpixel >> 8) & 0XFF;og = (opixel >> 8) & 0XFF;lb = (lpixel) & 0XFF;mb = (mpixel) & 0XFF;ob = (opixel) & 0XFF;/** 图像相乘 标定到0~255 */r = (lr * mr) / 255;g = (lg * mg) / 255;b = (lb * mb) / 255;// 相乘后图像与原图相加r = r + or;g = g + og;b = b + ob;outPixels[row * width + col] = (255 << 24) | (clamp(r) << 16)| (clamp(g) << 8) | (clamp(b));}}BufferedImage dest = new BufferedImage(width, height,BufferedImage.TYPE_INT_ARGB);if (type == BufferedImage.TYPE_INT_ARGB|| type == BufferedImage.TYPE_INT_RGB) {dest.getRaster().setDataElements(0, 0, width, height, outPixels);} else {dest.setRGB(0, 0, width, height, outPixels, 0, width);}return dest;}private int clamp(int value) {return value > 255 ? 255 : (value < 0 ? 0 : value);}

注:左边是原图,右边是将经过拉普拉斯锐化的图像和经过Sobel及均值滤波后的图像相乘再和原图像叠加的效果

第四步:伽马变换

伽马变换也叫幂律变换,是一个幂函数,可以压缩和扩展灰度级,图像经过幂函数的处理后,增加了对比度,下面看下代码和运行效果图,也是最终的效果图

/** 伽马变化 */public BufferedImage gammaProcess(BufferedImage src) {BufferedImage image = this.mathProcess(src);double gamma = 0.5;// 幂级数int type = image.getType();int width = src.getWidth();int height = src.getHeight();// 经过数学变换后的像素信息int[] pixels = new int[width * height];if (type == BufferedImage.TYPE_INT_ARGB|| type == BufferedImage.TYPE_INT_RGB) {image.getRaster().getDataElements(0, 0, width, height, pixels);}image.getRGB(0, 0, width, height, pixels, 0, width);int[] outPixels = new int[width * height];// 建立LUT查找表int[] lut = new int[256];for (int i = 0; i < 256; i++) {float f = (float) (i / 255.0);f = (float) Math.pow(f, gamma);lut[i] = (int) (f * 255.0);}int r = 0, g = 0, b = 0;int or = 0, og = 0, ob = 0;for (int row = 0; row < height; row++) {for (int col = 0; col < width; col++) {int pixel = pixels[row * width + col];r = (pixel >> 16) & 0XFF;g = (pixel >> 8) & 0XFF;b = (pixel) & 0XFF;or = lut[r];og = lut[g];ob = lut[b];outPixels[row * width + col] = (255 << 24) | (clamp(or) << 16)| (clamp(og) << 8) | (clamp(ob));}}BufferedImage dest = new BufferedImage(width, height,BufferedImage.TYPE_INT_ARGB);if (type == BufferedImage.TYPE_INT_ARGB|| type == BufferedImage.TYPE_INT_RGB) {dest.getRaster().setDataElements(0, 0, width, height, outPixels);} else {dest.setRGB(0, 0, width, height, outPixels, 0, width);}return dest;}

注:左边是原图,右边是最终效果图,经过伽马变换,扩展了灰度级,可以展示出人体的整个轮廓

这样,一个完成的案例就完成了,每一步的实现效果也都和书中的插图是一样的,如果有错误的地方欢迎指正!

转载于:https://www.cnblogs.com/wangyong/p/8367623.html

基础图像处理之混合空间增强——(Java:拉普拉斯锐化、Sobel边缘检测、均值滤波、伽马变换)...相关推荐

  1. 图像处理之混合空间增强——(Java:拉普拉斯锐化、Sobel边缘检测、均值滤波、伽马变换)

    相信看过冈萨雷斯第三版数字图像处理的童鞋都知道,里面涉及到了很多的基础图像处理的算法,今天,就专门借用其中一个混合空间增强的案例,来将常见的几种图像处理算法集合起来,看能发生什么样的化学反应 首先,通 ...

  2. 数字图像处理-3.7混合空间增强法-骨骼图 基于opencv3.4.3的实现

    引子 刚开始看冈萨雷斯的<数字图像处理>时,3.7节 混合空间增强法中图3.4.3中的全身骨骼图的印象非常深刻.牛XX啊,这么模糊,都能变得这么清楚.虽然书中也给出了大段大段的解释,但是能 ...

  3. 《数字图像处理》学习笔记(四)--混合空间增强法(待修改)

    这次试验问题很多,应该还是数据格式的问题,先发上来吧,放假回去先用Matlab做下,再改改..... 下面对一幅人体骨骼扫描图进行混合空间增强(有点吓人)...我们的目标是通过图像锐化突出骨骼的更多细 ...

  4. 图片的混合空间增强操作Opencv-python实现

    基于Opencv-python的图片混合空间增强操作 文章目录 基于Opencv-python的图片混合空间增强操作 前言 一.混合空间增强操作流程图 二.python代码实现操作 三.效果图 前言 ...

  5. 数字图像处理-空间域处理-灰度变换-基本灰度变换函数(反转变换、对数变换、伽马变换和分段线性变换)

    数字图像处理-空间域处理-灰度变换-基本灰度变换函数(反转变换.对数变换.伽马变换和分段线性变换) 空间域处理是直接对像素进行操作的方法,这是相对于频率域处理而言的.空间域处理主要分为两大类:灰度变换 ...

  6. 图像增强算法汇总(直方图均衡化、拉普拉斯、Log变换、gamma伽马变换)附MATLAB代码

    一.图像增强算法介绍 图像增强算法常见于对图像的亮度.对比度.饱和度.色调等进行调节,增加其清晰度,减少噪点等.图像增强往往经过多个算法的组合,完成上述功能,比如图像去燥等同于低通滤波器,增加清晰度则 ...

  7. 图像增强算法(直方图均衡化、拉普拉斯、Log、伽马变换)

    一.图像增强算法原理 图像增强算法常见于对图像的亮度.对比度.饱和度.色调等进行调节,增加其清晰度,减少噪点等.图像增强往往经过多个算法的组合,完成上述功能,比如图像去燥等同于低通滤波器,增加清晰度则 ...

  8. [Python图像处理] 十六.图像的灰度非线性变换之对数变换、伽马变换

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  9. 数字图像处理(18): 图像灰度变换——线性灰度变换 和 非线性灰度变换(对数变换 与 伽马变换)

    目录 1 灰度变换简介 2 线性灰度变换­-图像反转 3 非线性灰度变换 3.1 对数变换 3.2 伽马变换 参考资料 1 灰度变换简介 灰度变换是图像增强的一种重要手段,用于改善图像显示效果,属于空 ...

  10. 数字图像处理-python基于opencv代码实现 反转变换、对数变换和幂律(伽马)变换

    本文主要介绍对<数字图像处理>第三章书中示例图片实现 反转变换.对数变换以及伽马变换的代码 若要获取更多数字图像处理,python,深度学习,机器学习,计算机视觉等高清PDF以及 更多有意 ...

最新文章

  1. centos7 安装 python3
  2. java actor_Akka笔记之Actor简介
  3. Hibernate一对多关联映射及cascade级联操作
  4. C++数据结构之链式结构
  5. notepad编译java_Notepad++直接编译运行java代码的具体步骤
  6. java+yeild+sleep_java之yield(),sleep(),wait()区别详解-备忘笔记[转]
  7. 进行数据离散化的原因_数据离散化及其KMeans算法实现的理解
  8. xtreme toolkit pro——CXTPReportControl控件教程
  9. 谷歌浏览器好用的插件推荐
  10. 使用网络数据采集的好处
  11. mediapipe系列之一脸部特征点标记
  12. 【教程】安装torch_sparse、torch_cluster、torch_scatter、torch_spline
  13. 元宇宙3D设计系统【构思与展望】
  14. L1-022 奇偶分家(c)
  15. 解决nginx启动失败
  16. Ventory制作多系统启动u盘 和 安装 windows10+ubuntu双系统
  17. 看中科院大牛博士如何进行文献检索和阅读
  18. 微信登录流程图(转)
  19. stm32---端口复用和重映射
  20. SpringBoot项目入门,使用Eclipse创建Springboot项目

热门文章

  1. spring源码-bean加载整体流程
  2. Spring源码之bean的属性填充populateBean方法解读
  3. Sql语句优化-查询两表不同行NOT IN、NOT EXISTS、连接查询Left Join
  4. RocketMQ中的autoCreateTopicEnable是如何实现自动创建topic?
  5. error CS1010 CS8025 CS1012 CS1525 常见文档错误解决
  6. vSphere vMotion
  7. FreeSWITCH第三方库(音频)的简单介绍(一)
  8. 闲来无聊,随便看下asp.net Mvc 的收获
  9. Asp.net 5种页面转向方法 转载
  10. Android 自定义万能的抽屉布局(侧滑菜单)GenericDrawerLayout