2019-02-03 14:54:15 qq_42505705 阅读数 1379
  • webgl基础篇视频教程-坚如磐石

    webgl入门视频课程从基础开始介绍webgl技术,介绍基本的webgl渲染管线,各种常用的缓冲区的作用,以及用法,结合程序实例做到全方位的讲解;精讲三维的理论,针对三维理论中的三个矩阵变换一个坐标变换深入讲解.针对webgl核心技术逐个讲解;针对可编程管线,理论结合实践,让学员深刻的体验到shader的作用;重点围绕webgl的核心技术进行实践。

    26464 人正在学习 去看看 张立铜

本文主要介绍对《数字图像处理》第三章书中示例图片实现 反转变换对数变换以及伽马变换的代码

若要获取更多数字图像处理,python,深度学习,机器学习,计算机视觉等高清PDF以及 更多有意思的 分享,可搜一搜 微信公共号 “分享猿” 免费获取资源。也可扫描下面的二维码关注,期待你的到来~
在这里插入图片描述
图像增强的三类基本函数:线性函数(反转和恒等变换)、对数函数(对数和反对数变换)、幂律函数(n次幂和n次跟变换)

一、反转变换

公式S=L-1-r
在这里插入图片描述
代码实现

import cv2
import numpy as np

img = cv2.imread(r'C:\Users\xxx\Desktop\breast.tif',0)

reverse_img = 255 - img

cv2.imshow('srcimg',img)
cv2.imshow('reverse_img',reverse_img)
cv2.waitKey(0)

下列分别是乳房X射线原始图及用上式给出的反转图像
在这里插入图片描述 在这里插入图片描述
二、对数变换

公式s=clog(1+r)
下图是当c=1时的r与s关系图
在这里插入图片描述
代码实现

import cv2
import math
import numpy as np

def logTransform(c,img):

    #3通道RGB
    '''h,w,d = img.shape[0],img.shape[1],img.shape[2]
    new_img = np.zeros((h,w,d))
    for i in range(h):
        for j in range(w):
            for k in range(d):
                new_img[i,j,k] = c*(math.log(1.0+img[i,j,k]))'''

    #灰度图专属
    h,w = img.shape[0], img.shape[1]
    new_img = np.zeros((h, w))
    for i in range(h):
        for j in range(w):
            new_img[i, j] = c * (math.log(1.0 + img[i, j]))


    new_img = cv2.normalize(new_img,new_img,0,255,cv2.NORM_MINMAX)

    return new_img
    
#替换为你的图片路径
img = cv2.imread(r'C:\Users\xxx\Desktop\Fourier spectrum.tif',0)

log_img = logTransform(1.0,img)
cv2.imshow('log_img',log_img)
cv2.imwrite(r'C:\Users\xxx\Desktop\Fourier spectrum2.jpg',log_img)
cv2.waitKey(0)

备注:当r=255时,s=5.541

下列图像分别是傅里叶频谱和应用上式中的对数变换(c=1)的结果
在这里插入图片描述 在这里插入图片描述
由于对数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率较小,所以图像经过对数变换后,较暗区域的对比度将有所提升。可用于增强图像的暗部细节

三、幂律(伽马)变化

公式:s=cr^γ
其中c、γ 为常数。考虑偏移量上式可写为 s=c(ε+r)^γ
对于不同的 γ 值,s 与 r的关系曲线如下图所示
在这里插入图片描述
伽马变换可以很好地拉伸图像的对比度,扩展灰度级。
由图可知,
当图像的整体灰度偏暗时,选择γ<1,可以使图像增亮;
当图像的整体灰度偏亮时,选择γ>1,可以使图像变暗,
提高图像的对比度,凸显细节。

用于图像获取、打印和显示的各种设备根据幂律来产生响应,用于校正这些幂律响应现象的处理称为伽马校正
例如,阴极射线管(CRT)设备有一个灰度-电压响应,该响应是一个指数变化范围约为1.8~2.5的幂函数。

代码实现

import math
import numpy as np
import cv2

def gammaTranform(c,gamma,image):
    h,w,d = image.shape[0],image.shape[1],image.shape[2]
    new_img = np.zeros((h,w,d),dtype=np.float32)
    for i in range(h):
        for j in range(w):
            new_img[i,j,0] = c*math.pow(image[i, j, 0], gamma)
            new_img[i,j,1] = c*math.pow(image[i, j, 1], gamma)
            new_img[i,j,2] = c*math.pow(image[i, j, 2], gamma)
    cv2.normalize(new_img,new_img,0,255,cv2.NORM_MINMAX)
    new_img = cv2.convertScaleAbs(new_img)

    return new_img

img = cv2.imread(r'C:\Users\xxx\Desktop\gray.jpg',1)

new_img = gammaTranform(1,2.5,img)

cv2.imshow('x',new_img)
cv2.imwrite(r'C:\Users\xxx\Desktop\gray_2.5.jpg',new_img)
cv2.waitKey(0)

下图是用变换s = r^1/2.5 = r^0.4进行伽马校正的示例的结果
在这里插入图片描述
一般,随着设备的不同,伽马值也不同

使用幂律变换进行对比度增强
γ<1 增强亮度
分别是原图,以及c=1时的γ=0.6、0.4、0.3时应用上公示的结果
在这里插入图片描述

γ>1 增强暗度
航拍图像
在这里插入图片描述
下面三幅图片分别是c=1时γ等于3.0、4.0、5.0时应用公式变换的结果
在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

搜索公众号“分享猿”,并回复关键词“代码”,获取本文全部代码
留言或者公众号关注我,我们一起分享数字图像处理心得,一起交流学习吧~

2010-05-23 14:49:00 yangfenghero 阅读数 3459
  • webgl基础篇视频教程-坚如磐石

    webgl入门视频课程从基础开始介绍webgl技术,介绍基本的webgl渲染管线,各种常用的缓冲区的作用,以及用法,结合程序实例做到全方位的讲解;精讲三维的理论,针对三维理论中的三个矩阵变换一个坐标变换深入讲解.针对webgl核心技术逐个讲解;针对可编程管线,理论结合实践,让学员深刻的体验到shader的作用;重点围绕webgl的核心技术进行实践。

    26464 人正在学习 去看看 张立铜

   幂次变换的基本表达式为:y=cxr+b

    其中cr均为正数。与对数变换相同,幂次变换将部分灰度区域映射到更宽的区域中。当r=1时,幂次变换转变为线性变换。

   (1)  当r<0时,变换函数曲线在正比函数上方。此时扩展低灰度级,压缩高灰度级,使图像变亮。这一点与对数变换十分相似。

   (2)  当r>0时,变换函数曲线在正比函数下方。此时扩展高灰度级,压缩低灰度级,使图像变暗。

   代码如下:

 

2019-11-14 20:11:58 qq_41398808 阅读数 124
  • webgl基础篇视频教程-坚如磐石

    webgl入门视频课程从基础开始介绍webgl技术,介绍基本的webgl渲染管线,各种常用的缓冲区的作用,以及用法,结合程序实例做到全方位的讲解;精讲三维的理论,针对三维理论中的三个矩阵变换一个坐标变换深入讲解.针对webgl核心技术逐个讲解;针对可编程管线,理论结合实践,让学员深刻的体验到shader的作用;重点围绕webgl的核心技术进行实践。

    26464 人正在学习 去看看 张立铜

幂律变换的基本形式为:s=cr^{\gamma },其中c\gamma是常数

有时考虑到偏移量,上式也写为s=c(r+\varepsilon )^{\gamma }。然而,偏移量是一般显示标定问题,因而作为一个结果,通常在上式中忽略不计。

与对数变换情况类似,部分\gamma值得幂律曲线将较窄范围的暗色值,映射位较宽的目标输出值,相反,对于输入高灰度级值时也成立。

\gamma>1的值所生成的曲线和\gamma<1所生成的曲线的效果完全相反,当c=\gamma=1时简化为了恒等变换。

下面使用Python实现幂律变换:

使用的图片数据为:

 导入要使用的第三方库:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

 读取图片数据,并可视化:

img = Image.open('小亮点.jpg')
plt.axis('off')
plt.imshow(img)
plt.show()

 图像数据转换为numpy数组:

img_data = np.array(img)

 定义幂律变换函数:

def power_law_rollovers(img, func, c, b):
    img_data = np.array(img)
    a = np.shape(img_data)
    new_img = []
    for i in range(a[0]):
        new_row = []
        for j in range(a[1]):
            data = list(img_data[i][j])
            new_data = func(data, c, b)
            new_row.append(np.array(new_data))
        new_img.append(np.array(new_row))
    return new_img
def power_law(data, c, b):
    new_data = []
    for k in data:
        a = int(c*(k**b))
        new_data.append(a)
    return new_data

 结果:

共生成4张图片,参数c=1,参数\gamma分别等于0.8,0.6,0.4,0.3

new_img1 = power_law_rollovers(img, power_law, 1, 0.8)
new_img2 = power_law_rollovers(img, power_law, 1, 0.6)
new_img3 = power_law_rollovers(img, power_law, 1, 0.4)
new_img4 = power_law_rollovers(img, power_law, 1, 0.3)

new_img1 = np.array(new_img1)
new_img2 = np.array(new_img2)
new_img3 = np.array(new_img3)
new_img4 = np.array(new_img4)

new_img1 = Image.fromarray(new_img1.astype('uint8')).convert('RGB')
new_img2 = Image.fromarray(new_img2.astype('uint8')).convert('RGB')
new_img3 = Image.fromarray(new_img3.astype('uint8')).convert('RGB')
new_img4 = Image.fromarray(new_img4.astype('uint8')).convert('RGB')

plt.figure(figsize=(25,60))
plt.subplot(221)
plt.axis('off')
gray1 = new_img1.convert('L')
plt.imshow(gray1, cmap='gray')
plt.subplot(222)
plt.axis('off')
gray2 = new_img2.convert('L')
plt.imshow(gray2, cmap='gray')
plt.subplot(223)
plt.axis('off')
gray3 = new_img3.convert('L')
plt.imshow(gray3, cmap='gray')
plt.subplot(224)
plt.axis('off')
gray4 = new_img4.convert('L')
plt.imshow(gray4, cmap='gray')
plt.show()

 

 

2018-09-27 21:19:18 perry0528 阅读数 920
  • webgl基础篇视频教程-坚如磐石

    webgl入门视频课程从基础开始介绍webgl技术,介绍基本的webgl渲染管线,各种常用的缓冲区的作用,以及用法,结合程序实例做到全方位的讲解;精讲三维的理论,针对三维理论中的三个矩阵变换一个坐标变换深入讲解.针对webgl核心技术逐个讲解;针对可编程管线,理论结合实践,让学员深刻的体验到shader的作用;重点围绕webgl的核心技术进行实践。

    26464 人正在学习 去看看 张立铜

对数变换:

CImg<int> SrcImg;
SrcImg.load_tiff("E:/Desktop/picture_process/Lenna/3/Fig0305(a)(DFT_no_log).tif");
SrcImg.display();
cimg_forXY(SrcImg, x, y) {
	SrcImg(x, y) = int(log(double(SrcImg(x, y)) + 1));
}
SrcImg.display();

运行效果:
在这里插入图片描述

在这里插入图片描述

幂律变换

CImg<int> SrcImg;
SrcImg.load_tiff("E:/Desktop/picture_process/Lenna/3/Fig0308(a)(fractured_spine).tif");
SrcImg.display();
double t[3] = { 0.6,0.4,0.3 };
for (int i = 0; i < 3; i++) {
	CImg<int> img = SrcImg;
	cimg_forXY(img, x, y) {
		img(x, y) = int(pow(double((img(x, y))), t[i]));
	}
	img.display();
}

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

比特面分层

CImg<int> img;
	img.load_tiff("E:/Desktop/picture_process/Lenna/3/Fig0314(a)(100-dollars).tif");
	img.display("原图");
	int w = img.height();
	int h = img.width();
	CImg<int> p1(h,w,1,1), p2(h, w, 1, 1), p3(h, w, 1, 1), p4(h, w, 1, 1), p5(h, w, 1, 1), p6(h, w, 1, 1), p7(h, w, 1, 1), p8(h, w, 1, 1);
	cimg_forXY(img, x, y) {
		int num = img(x, y);
		int *bit = binary(num);
		p1(x, y) = fx(bit[0]); p2(x, y) = fx(bit[1]); p3(x, y) = fx(bit[2]); p4(x, y) = fx(bit[3]);
		p5(x, y) = fx(bit[4]); p6(x, y) = fx(bit[5]); p7(x, y) = fx(bit[6]); p8(x, y) = fx(bit[7]);
	}
	p8.display("第八层比特图");
	p7.display("第七层比特图");
	p6.display("第六层比特图");
	p5.display("第五层比特图");
	p4.display("第四层比特图");
	p3.display("第三层比特图");
	p2.display("第二层比特图");
	p1.display("第一层比特图");
}
//用于对图片进行黑白的赋值
int fx(int n) {
	if (n == 1)
		return 255;
	else
		return 0;
}
//用于进行二进制转化的函数
int* binary(int num) {
	int *bit;
	bit = new int[8];
	for (int i = 0; i < 8; i++) {
		bit[i] = 0;
	}
	int i = 0;
	while (num) {
		bit[i] = num % 2;
		num /= 2;
		i++;
	}
	return bit;
}

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

均衡化处理

  • CImg有专门显示密度分布直方图的histogram函数
	CImg<int> hist = img.histogram(256, 0, 255); //histogram的第一个参数是共有256个灰度级,第二个参数是灰度的最小值,第三个是灰度最大值
	hist.display_graph();
	CImg<int> img;
	img.load_tiff("E:/Desktop/picture_process/Lenna/3/Fig0316(4)(bottom_left).tif");
	CImg<int> pic = img;
	img.display("处理前图片");
	int size = img.size();
	CImg<int> hist = img.histogram(256, 0, 255); //histogram的第一个参数是共有256个灰度级,第二个参数是灰度的最小值,第三个是灰度最大值
	hist.display_graph("处理前直方图");
	double sum = 0.0;
	map<int, int> index;
	for (int i = 0; i < 256; i++) {
		sum += (double) hist(i)/size;
		int Sum = (int)(sum * 255);
		index.insert(pair<int, int>(i, Sum));
	}
	//map<int, int>::iterator iter = index.begin();
	//map<int, int>::iterator end = index.end();
	/*for (; iter != end; iter++) {
		cout << iter->first<<":"<< iter->second << endl;
	}*/
	cimg_forXY(pic, x, y) {
		pic(x, y) = index[pic(x, y)];
		//cout << pic(x, y) << " ";
	}
	pic.display("处理后图片");
	CImg<int> hist1 = pic.histogram(256, 0, 255);
	hist1.display_graph("处理后直方图");

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2017-06-24 22:40:20 Dangkie 阅读数 6471
  • webgl基础篇视频教程-坚如磐石

    webgl入门视频课程从基础开始介绍webgl技术,介绍基本的webgl渲染管线,各种常用的缓冲区的作用,以及用法,结合程序实例做到全方位的讲解;精讲三维的理论,针对三维理论中的三个矩阵变换一个坐标变换深入讲解.针对webgl核心技术逐个讲解;针对可编程管线,理论结合实践,让学员深刻的体验到shader的作用;重点围绕webgl的核心技术进行实践。

    26464 人正在学习 去看看 张立铜

灰度变换是图像处理技术中的最简单的技术。
图像增强常用的三类基本函数:
1. 线性函数(反转和恒等变换)
2. 对数函数(对数和反对数变换)
3. 幂律函数(n次幂和n次根变换)

基本灰度变换函数如图:
基本灰度变换函数
对数变换可以将输入中范围较窄的低灰度值映射为输出中较宽范围的灰度值,相反的,对高的输入灰度值也是如此。
r和s代表处理前后的像素值。灰度级范围[0,L-1],如[0,255]
图像反转:s = L - 1 - r


对数变换: s = clog(1+r)
对数函数可以对图像的灰度级进行扩展/压缩,一般进行傅里叶变换后的图像都会采用上式进行变换后显示。


幂律(伽马)变换:s=crγ
如图不同γ值的变换曲线如图:
伽马变换
与对数变换类似,部分的γ值幂律曲线将变窄范围的暗色输入值映射为较宽范围的输出值,相反,对于对于输入高灰度级值也成立。但是与对数变换不同的是,随着γ的变化,将会得到一簇可能的变换曲线。
幂律变换在通用对比度操作中很有用,比如扩展整体偏暗图像的灰度级,此时γ小于1,或者对图像有冲淡外观(偏亮)的进行压缩,即γ大于1。


分段线性变换函数:
1. 对比度拉伸
2. 灰度级分层
3. 比特平面分层:
256级灰度图像中,每个像素的灰度由8比特(一个字节)组成(281)。比特平面分层可用于图像压缩,一般存储4个高阶比特平面将允许我们以可以接受的细节来重建原图像。


直方图处理
直方图是多种空间域处理技术的基础,直方图操作可用于图像增强。
1. 直方图均衡
直方图均衡化选用累积分布函数,因为累积分布函数是单调增函数(控制大小关系),并且值域是0到1(控制越界问题)。
概率分布函数图像中像素参差不齐,累积分布函单调递增。
2. 直方图匹配(规定化)
使处理后的图像具有规定的直方图形状。
直方图规定化增强处理的步骤如下:
- (1).其增强原理是先对原始的直方图均衡化:S = T(r)
- (2).同时对规定的直方图均衡化:v = G(z)
- (3).由于都是均衡化,故令 S = v,则:z=G1(v)=G1[T(r)]
3. 局部直方图处理
4. 直方图统计进行图像增强
均值是平均灰度的度量,方差(或标准差)是图像对比度的度量。
直方图增强

没有更多推荐了,返回首页