OpenCV计算机视觉学习(3)——图像灰度线性变换与非线性变换(对数变换,伽马变换)

OpenCV(四)图像线性变换、图像加减乘除、图像逻辑运算(线性变换包括:图像线性混合、亮度和对比度增强、线性变换API) 目录 一、图像线性混合 1、原理及函数介绍 2、代码 3、图像 二、亮度和对比度增强 1、概念(亮度和对比度) 2、原理 3、单通道处理(灰度图) 代码: 效果: 4、多通道处理(彩图) 代码: 效果: 5、代码 三、线性变换API 代码 总代码 参考资料: 一、图像线性混合 1、原理及函数介绍 原理(公式):dst(r, c) = * src1(r, c) +* src2(r, c) + 本质:... 阅读详情

 

人工智能学习离不开实践的验证,推荐大家可以多在FlyAI-AI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力。FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台。每周免费提供项目开源算法样例,支持算法能力变现以及快速的迭代算法模型。

如果需要处理的原图及代码,请移步小编的GitHub地址

  传送门:请点击我

  如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice

  下面主要学习图像灰度化的知识,结合OpenCV调用 cv2.cvtColor()函数实现图像灰度化,使用像素处理方法对图像进行灰度化处理。

1.  图像灰度化

1.1 图像灰度化的目的

  将彩色图像转化为灰度图像的过程是图像的灰度化过程。彩色图像中的每个像素的颜色由 R, G, B三个分量决定,而每个分量中可以取值 0~255,这样一个像素点可以有 1600多万(255*255*255=16581375)的颜色的变化范围。而灰度图像是 R,G,B三个分量相同的一种特殊的彩色图像,其中一个像素点的变换范围为 256 种,所以在数字图像处理中一般将各种格式的图像转换为灰度图像以使后续的图像计算量少一些。灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和高亮等级的分布和特征。

1.2  图像灰度化原理

  图像灰度化是将一幅彩色图像转换为灰度化图像的过程。彩色图像通常包括R、G、B三个分量,分别显示出红绿蓝等各种颜色,灰度化就是使彩色图像的R、G、B三个分量相等的过程。灰度图像中每个像素仅具有一种样本颜色,其灰度是位于黑色与白色之间的多级色彩深度,灰度值大的像素点比较亮,反之比较暗,像素值最大为255(表示白色),像素值最小为0(表示黑色)。

  图像灰度化核心思想是 R = G = B ,这个值也叫灰度值。

  假设某点的颜色由RGB(R,G,B)组成,常见灰度处理算法如下表所示(盗图:https://blog.youkuaiyun.com/Eastmount/article/details/88785768)

   上表中Gray表示灰度处理之后的颜色,然后将原始RGB(R,G,B)颜色均匀地替换成新颜色RGB(Gray,Gray,Gray),从而将彩色图片转化为灰度图像。

  一种常见的方法是加权平均灰度处理,这种效果是最好的。是将RGB三个分量求和再取平均值,但更为准确的方法是设置不同的权重,将RGB分量按不同的比例进行灰度划分。比如人类的眼睛感官蓝色的敏感度最低,敏感最高的是绿色,因此将RGB按照0.299、0.587、0.114比例加权平均能得到较合理的灰度图像,如公式所示:

1.3  图像灰度化的三种方法

1.3.1  OpenCV直接灰度化

  下面的这种方法,在读取图片的时候,直接将图片转化为灰度化:

1

2

3

import cv2

 

img = cv2.imread(photo_file, cv2.IMREAD_GRAYSCALE)

  得到的img是一个函数。

1.3.2   OpenCV先读取再灰度化

  下面的方法,先读取图片,然后再转化为灰度图。

1

2

3

4

5

import  cv2

 

img = cv2.imread(photo_file)

# Y = 0.299R + 0.587G + 0.114B

grey_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

  

1.3.3  使用PIL库中的Image模块

  首先读取图片,然后灰度化,最后转化为数组

1

2

3

4

5

6

7

8

9

import numpy as np

form PIL import Image

 

# 使用PIL库中的Image模块

# L = 0.299R + 0.587G + 0.114B

img2 = Image.open(photo_file)

grey_img2 = img2.convert('L')

grey_img22 = np.array(grey_img2)

print(type(grey_img22))

  使用python中的图像处理库PIL来实现不同图像格式的转化,对于彩色图像,不管其图像格式是PNG,还是BMP,还是JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。而对于灰度图像,不管其图像格式是PNG,还是BMP,或者JPG,打开后,其模式为“L”。

1.4  图像灰度化练习

  下面代码是调用cvtColor()函数将图像进行灰度化处理的代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

#_*_coding:utf-8_*_

import cv2

import numpy as np

import matplotlib.pyplot as plt

  

#读取原始图片

src1 = cv2.imread('irving.jpg')

src2 = cv2.cvtColor(src1, cv2.COLOR_BGR2RGB)

  

#图像灰度化处理

grayImage = cv2.cvtColor(src1, cv2.COLOR_RGB2GRAY)

grayImage1 = cv2.imread('irving.jpg', 0)

# #显示图像

# cv2.imshow("src", src)

# cv2.imshow("result", grayImage)

  

# #等待显示

# cv2.waitKey(0)

# cv2.destroyAllWindows()

 

plt.subplot(2,2,1), plt.imshow(src1)

plt.xticks([]), plt.yticks([])

plt.title('origin image BGR')

plt.subplot(2,2,2), plt.imshow(src2)

plt.xticks([]), plt.yticks([])

plt.title('origin image RGB')

plt.subplot(2,2,3), plt.imshow(grayImage)

plt.xticks([]), plt.yticks([])

plt.title('BGR2gray image')

plt.subplot(2,2,4), plt.imshow(grayImage1)

plt.xticks([]), plt.yticks([])

plt.title('gray image')

plt.show()

  处理结果如下:

   注意:灰度化的图,在matplotlib里显示图像不是灰色的,这里因为通道转换问题,这里我们在OpenCV中显示则正常。

 

2,基于像素操作的图像灰度化处理

  基于像素操作的图像灰度化处理方法,主要是最大值灰度处理、平均灰度处理和加权平均灰度处理方法。其实之前也学习过,这里再整理一遍。

2.1  最大值灰度处理方法

  该方法的灰度值等于彩色图像R、G、B三个分量中的最大值,其公式如下:

  这种方法灰度化处理后的灰度图亮度很高(即灰度偏亮)。

  代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

#_*_coding:utf-8_*_

import cv2 

import numpy as np 

import matplotlib.pyplot as plt

 

#读取原始图像

img = cv2.imread('irving.jpg')

src = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

 

#获取图像高度和宽度

height = img.shape[0]

width = img.shape[1]

 

#创建一幅图像

grayimg = np.zeros((height, width, 3), np.uint8)

 

#图像最大值灰度处理

for i in range(height):

    for j in range(width):

        #获取图像R G B最大值

        gray = max(img[i,j][0], img[i,j][1], img[i,j][2])

        #灰度图像素赋值 gray=max(R,G,B)

        grayimg[i,j] = np.uint8(gray)

 

# #显示图像

# cv2.imshow("src", img)

# cv2.imshow("gray", grayimg)

 

# #等待显示

# cv2.waitKey(0)

# cv2.destroyAllWindows()

 

plt.subplot(1,3,1), plt.imshow(img)

plt.xticks([]), plt.yticks([])

plt.title('origin image BGR')

plt.subplot(1,3,2), plt.imshow(src)

plt.xticks([]), plt.yticks([])

plt.title('origin image RGB')

plt.subplot(1,3,3), plt.imshow(grayimg)

plt.xticks([]), plt.yticks([])

plt.title('max gray image')

plt.show()

  图如下:

2.2   平均灰度处理方法

  该方法的灰度值等于彩色图像 R,G,B 是哪个分量灰度值的求和平均值,其计算公式如下所示:

  这种方法产生的灰度图像比较柔和。

   平均灰度处理方法实现代码如下所示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

#_*_coding:utf-8_*_

import cv2 

import numpy as np 

import matplotlib.pyplot as plt

 

#读取原始图像

img = cv2.imread('irving.jpg')

 

src = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

 

#获取图像高度和宽度

height = img.shape[0]

width = img.shape[1]

 

#创建一幅图像

grayimg = np.zeros((height, width, 3), np.uint8)

 

#图像平均灰度处理方法

for i in range(height):

    for j in range(width):

        #灰度值为RGB三个分量的平均值

        gray = (int(img[i,j][0]) + int(img[i,j][1]) + int(img[i,j][2]))  /  3

        grayimg[i,j] = np.uint8(gray)

 

# #显示图像

# cv2.imshow("src", img)

# cv2.imshow("gray", grayimg)

 

# #等待显示

# cv2.waitKey(0)

# cv2.destroyAllWindows()

 

plt.subplot(1,3,1), plt.imshow(img)

plt.xticks([]), plt.yticks([])

plt.title('origin image BGR')

plt.subplot(1,3,2), plt.imshow(src)

plt.xticks([]), plt.yticks([])

plt.title('origin image RGB')

plt.subplot(1,3,3), plt.imshow(grayimg)

plt.xticks([]), plt.yticks([])

plt.title('mean gray image')

plt.show()

      效果如下:

2.3   加权平均灰度处理方法

  该方法根据色彩重要性,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像。

  这种灰度化得到的灰度图像效果最好。

   加权平均灰度处理方法实现代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

#_*_coding:utf-8_*_

import cv2 

import numpy as np 

import matplotlib.pyplot as plt

 

#读取原始图像

img = cv2.imread('irving.jpg')

 

src = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

 

#获取图像高度和宽度

height = img.shape[0]

width = img.shape[1]

 

#创建一幅图像

grayimg = np.zeros((height, width, 3), np.uint8)

 

#加权平均灰度处理方法

for i in range(height):

    for j in range(width):

        #灰度加权平均法

        gray = 0.30 * img[i,j][0] + 0.59 * img[i,j][1] + 0.11 * img[i,j][2]

        grayimg[i,j] = np.uint8(gray)

 

# #显示图像

# cv2.imshow("src", img)

# cv2.imshow("gray", grayimg)

 

# #等待显示

# cv2.waitKey(0)

# cv2.destroyAllWindows()

 

plt.subplot(1,3,1), plt.imshow(img)

plt.xticks([]), plt.yticks([])

plt.title('origin image BGR')

plt.subplot(1,3,2), plt.imshow(src)

plt.xticks([]), plt.yticks([])

plt.title('origin image RGB')

plt.subplot(1,3,3), plt.imshow(grayimg)

plt.xticks([]), plt.yticks([])

plt.title('weighted mean gray image')

plt.show()

   效果如下:

3,图像灰度线性变换原理

  图像的灰度线性变换是通过建立灰度映射来调整原始图像的灰度,从而改善图像的质量,凸显图像的细节,提高图像的对比度。灰度线性变换的计算公式如下所示:

  该公式中DB表示灰度线性变换后的灰度值,DA表示变换前输入图像的灰度值,α和b为线性变换方程f(D)的参数,分别表示斜率和截距。

  • 当α=1,b=0时,保持原始图像
  • 当α=1,b!=0时,图像所有的灰度值上移或下移
  • 当α=-1,b=255时,原始图像的灰度值反转
  • 当α>1时,输出图像的对比度增强
  • 当0<α<1时,输出图像的对比度减小
  • 当α<0时,原始图像暗区域变亮,亮区域变暗,图像求补

  如下图所示,显示了图像灰度线性变换对应的效果图:

    下面一一学习。

3.1 图像灰度上移变换

  该算法将实现图像灰度值的上移,从而提升图像的亮度,由于图像的灰度值位于0到255区间之内,所以需要对灰度值进行溢出判断。其实现代码如下所示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

import cv2

import numpy as np

import matplotlib.pyplot as plt

 

# 读取原始图像

img = cv2.imread('irving.jpg')

 

# 图像灰度转换

grayimage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

 

# 获取图像高度和宽度

height = grayimage.shape[0]

width = grayimage.shape[1]

 

# 创建一幅图像

result = np.zeros((height, width), np.uint8)

 

# 图像灰度上移变换  DB = DA + 50

for i in range(height):

    for j in range(width):

        if (int(grayimage[i, j] + 50) > 255):

            gray = 255

        else:

            gray = int(grayimage[i, j] + 50)

        result[i, j] = np.uint8(gray)

 

# 显示图像

cv2.imshow("Gray Image", grayimage)

cv2.imshow("Result", result)

 

# 等待显示

cv2.waitKey(0)

cv2.destroyAllWindows()

  其输出结果如下所示:

   我们可以看到,图像的所有灰度值上移 50,图像变得更白了。(注意:纯黑色对应的灰度值为0,纯白色的对应的灰度值为255)

3.2  图像对比度增强变换

  该算法将增强图像的对比度。Python实现代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

import cv2

import numpy as np

import matplotlib.pyplot as plt

 

# 读取原始图像

img = cv2.imread('irving.jpg')

 

# 图像灰度转换

grayimage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

 

# 获取图像高度和宽度

height = grayimage.shape[0]

width = grayimage.shape[1]

 

# 创建一幅图像

result = np.zeros((height, width), np.uint8)

 

# 图像对比度增强变换  DB = DA * 1.5

for i in range(height):

    for j in range(width):

        if (int(grayimage[i, j] * 1.5) > 255):

            gray = 255

        else:

            gray = int(grayimage[i, j] * 1.5)

        result[i, j] = np.uint8(gray)

 

# 显示图像

cv2.imshow("Gray Image", grayimage)

cv2.imshow("Result", result)

 

# 等待显示

cv2.waitKey(0)

cv2.destroyAllWindows()

   结果如下:

   结果就是图像所有的灰度值增强 1.5倍,我们发现变亮了。

3.3  图像对比度减弱变换

  该算法将减弱图像的对比度,Python实现代码如下所示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

import cv2

import numpy as np

import matplotlib.pyplot as plt

 

# 读取原始图像

img = cv2.imread('irving.jpg')

 

# 图像灰度转换

grayimage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

 

# 获取图像高度和宽度

height = grayimage.shape[0]

width = grayimage.shape[1]

 

# 创建一幅图像

result = np.zeros((height, width), np.uint8)

 

# 图像对比度减弱变换  DB = DA * 0.8

for i in range(height):

    for j in range(width):

        if (int(grayimage[i, j] * 0.8) > 255):

            gray = 255

        else:

            gray = int(grayimage[i, j] * 0.8)

        result[i, j] = np.uint8(gray)

 

# 显示图像

cv2.imshow("Gray Image", grayimage)

cv2.imshow("Result", result)

 

# 等待显示

cv2.waitKey(0)

cv2.destroyAllWindows()

  结果如下所示:

   我们从结果可以看出,图像的所有灰度值减弱,图像变得更暗。

3.4  图像灰度反色变换

  反色变换又称线性灰度求补变换,它是对原图像的像素值进行反转,即黑色变为白色,白色变为黑色的过程。其Python实现代码如下所示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

import cv2

import numpy as np

import matplotlib.pyplot as plt

 

# 读取原始图像

img = cv2.imread('irving.jpg')

 

# 图像灰度转换

grayimage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

 

# 获取图像高度和宽度

height = grayimage.shape[0]

width = grayimage.shape[1]

 

# 创建一幅图像

result = np.zeros((height, width), np.uint8)

 

# 图像灰度反色变换  DB = 255 - DA

for i in range(height):

    for j in range(width):

        gray = 255 - grayimage[i, j]

        result[i, j] = np.uint8(gray)

 

# 显示图像

cv2.imshow("Gray Image", grayimage)

cv2.imshow("Result", result)

 

# 等待显示

cv2.waitKey(0)

cv2.destroyAllWindows()

   其结果如下所示:

   我们发现,图像处理前后的灰度值是互补的。

  注意:图像灰度反色变换在医学图像处理中有一定的应用,如下图所示:

4,图像灰度非线性变换

  图像的灰度非线性变换主要包括对数变换,幂次变换,指数变换,分段函数变换,通过非线性关系对图像进行灰度处理,下面学习三种常见类型的灰度非线性变换。

4.1 图像灰度非线性变换:DB = DA * DA / 255

  下面我们将原始图像的灰度值按照DB = DA * DA / 255 的公式进行非线性变换,其代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

import cv2

import numpy as np

import matplotlib.pyplot as plt

 

# 读取原始图像

img = cv2.imread('irving.jpg')

 

# 图像灰度转换

grayimage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

 

# 获取图像高度和宽度

height = grayimage.shape[0]

width = grayimage.shape[1]

 

# 创建一幅图像

result = np.zeros((height, width), np.uint8)

 

# 图像灰度非线性变换  DB = DA * DA / 255

for i in range(height):

    for j in range(width):

        gray = int(grayimage[i, j]) * int(grayimage[i, j]) / 255

        result[i, j] = np.uint8(gray)

 

# 显示图像

cv2.imshow("Gray Image", grayimage)

cv2.imshow("Result", result)

 

# 等待显示

cv2.waitKey(0)

cv2.destroyAllWindows()

   结果如下:

4.2 图像灰度对数变换

  图像灰度的对数变换一般表示如公式所示:

  其中 c 为尺度比较常数,DA为原始图像灰度值,DB为变换后的目标灰度值。如下图所示,它表示对数曲线下的灰度值变换情况。

  

由于对数曲线在像素值较低的区域斜率大,在像素值高的区域斜率较小,所以图像经过对数变换后,较暗区域的对比度将有所提升。这种变换可用于增强图像的暗部细节,从而用来扩展被压缩的高值图像中的较暗像素。

  对数变换实现了扩展低灰度值而压缩高灰度值的效果,被广泛的应用于频谱图像的显示中。一个典型的应用是傅里叶频谱,其动态范围可能宽达 0 ~ 106 直接显示频谱时,图像显示设备的动态范围往往不能满足要求,从而丢失大量的暗部细节;而在使用对数变换之后,图像的动态范围被合理的非线性压缩,从而可以清晰地显示。在下图中,未经变换的频谱经过对数变换后,增加了低灰度区域的对比度,从而增强暗部的细节。(关于傅里叶变换,我后面会学习)

   下面代码实现了图像灰度的对数变换:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

import cv2

import numpy as np

import matplotlib.pyplot as plt

 

 

# 绘制曲线

def log_plot(c):

    x = np.arange(0, 256, 0.01)

    y = c * np.log(1 + x)

    plt.plot(x, y, 'r', linewidth=1)

    # 正常显示中文标签

    plt.rcParams['font.sans-serif'] = ['SimHei']

    plt.title(u'对数变换函数')

    plt.xlim(0, 255), plt.ylim(0, 255)

    plt.show()

 

 

# 对数变换

def log(c, img):

    output = c * np.log(1.0 + img)

    output = np.uint8(output + 0.5)

    return output

 

 

# 读取原始图像

img = cv2.imread('irving.jpg')

 

# 绘制对数变换曲线

log_plot(42)

 

# 图像灰度对数变换

result = log(42, img)

 

# 显示图像

cv2.imshow("Image", img)

cv2.imshow("Result", result)

 

# 等待显示

cv2.waitKey(0)

cv2.destroyAllWindows()

   结果如下图:

  对应的对数函数曲线如图所示:

  对数变换对于整体对比度偏低并且灰度值偏低的图像增强效果较好。

4.3  图像灰度伽马变换

  gamma矫正通常用于电汇和监视器系统中重现摄像机拍摄的画面,在图像处理中也可用于调节图像的对比度,减少图像的光照不均和局部阴影。

  gamma变换又称为指数变换或幂次变换,是另外一种常用的灰度非线性变换。图像灰度的伽马变换一般表示如下:

  gamma矫正示意图:

   结合上图看gamma矫正的作用:

  • 1,当 gamma<1时,如虚线所示,在低灰度值区域内,动态范围变大,进而图像对比度增强(当 x € [0, 0.2] 时,y的范围从 [0, 0.218] 扩大到 [0, 0.5]);在高灰度值区域内,动态范围变小,图像对比度降低(当 x € [ 0.8, 1]时,y的范围从 [0.8, 1] 缩小到 [0.9, 1],同时,图像整体的灰度值变大)。简单来说:会拉伸图像中灰度级较低的区域,压缩灰度级较高的部分。
  • 2,当 gamma >1时,如实线所示,低灰度值区域的动态范围变小,高灰度值区域在动态范围内变大,降低了低灰度值区域图像对比度。提高了高灰度值区域图像对比度。同时,图像整体的灰度值变小。简单来说:会拉伸体现中灰度级较高的区域,压缩灰度级较低的部分。
  • 3,当 gamma=1时,该灰度变换是线性的,此时通过线性方式改变原图像。

   当一张图片的像素在颜色空间的值都比较大(曝光过度)或者比较小(曝光不足)的情况下,选用合理的R值能减少或者增加其颜色亮度,并使颜色分布更为均匀和丰富,图片效果得到明显的改善。但是这种方法并非对所有在曝光上有缺陷的图片都适用,这是在使用这个方法的时候必须要注意的。

  当一张曝光过度的图片中存在颜色较暗的区域(比如背光面,阴影,颜色较深的物体),由 gamma函数图像可以看出,当选取较小的R值,过度曝光得不到充分的改善;而当选取较大的R值,该区域将会变成黑乎乎的一片;同样,当一张曝光不足的图片存在颜色较亮的区域(比如天空,白色背景,反光物等),如果选取R值较大,则曝光不足得不到改善;而选取较小的R值,这个区域变得更亮,从图片上看就觉得很“扎眼”。

  因此,虽然这种方法对图片的曝光率具有较好的调整效果,但是如果素材敏感差异较大,在调整较暗或较亮区域时,要注意减少对较暗或较亮区域的影响。事实上可以根据相同的原理,利用插值的方法构造相对应的处理函数,以得到更加精致的处理效果。

  使用Python实现,可以通过除以像素最大值,先将图像像素值调整到 0~1之间,然后进行不同的 gamma值的gamma矫正,python代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

import cv2

import numpy as np

import matplotlib.pyplot as plt

 

 

# 绘制曲线

def gamma_plot(c, gamma):

    x = np.arange(0, 256, 0.01)

    # y = c * x ** gamma

    y = c * np.power(x, gamma)

    plt.plot(x, y, 'r', linewidth=1)

    plt.rcParams['font.sans-serif'] = ['SimHei']  # 正常显示中文标签

    plt.title(u'伽马变换函数')

    plt.xlim([0, 255]), plt.ylim([0, 255])

    plt.show()

 

 

# 伽玛变换

def gamma(img, c, gamma):

    # 映射表必须为0~255(改成其他会报错)

    gamma_table = c * [np.power(x/255.0, gamma) * 255.0 for x in range(256)]

    # Numpy数组默认数据类型为 int32,需要将数据类型转换为opencv图像适合使用的无符号八位整形

    # round() 方法返回浮点数x的四舍五入值。

    gamma_table = np.round(np.array(gamma_table)).astype(np.uint8)

    output_img = cv2.LUT(img, gamma_table)

    return output_img

 

def gamma_1(img, c, gamma):

    # 映射表必须为0~255(改成其他会报错)

    output_img = c * np.power(img / float(np.max(img)), gamma) * 255.0

    output_img = np.uint8(output_img)

    return output_img

 

 

# 读取原始图像

img = cv2.imread('irving.jpg')

 

# 将图像转换为灰度,我们需要使用灰度图做gamma矫正

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

 

# 绘制伽玛变换曲线

gamma_plot(1, 4.0)

 

# 图像灰度伽玛变换

result = gamma(gray, 1, 0.4)

result1 = gamma_1(gray, 1, 0.4)

 

# 显示图像

cv2.imshow("Image", img)

cv2.imshow("Result", result)

cv2.imshow("Result 1", result1)

 

# 等待显示

cv2.waitKey(0)

cv2.destroyAllWindows()

  除以最大值的目的是归一化,将像素值调整到0~1之间。

  我们看结果:

 

4.3  opencv中  cv2.LUT() 函数

  此函数主要用来其到突出的有用信息,增强图像的光对比度的作用。通过对input的灰度像素的改变,可以通过映射的关系得到需要输出的灰度像素矩阵 output。

  或者这样讲:使用查找表中的值填充输出数组。我们看源码解析:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

def LUT(src, lut, dst=None): # real signature unknown; restored from __doc__

    """

    LUT(src, lut[, dst]) -> dst

    .   @brief Performs a look-up table transform of an array.

    对数组执行查找表转换。

    .  

    .   The function LUT fills the output array with values from the look-up table. Indices of the entries

    .   are taken from the input array. That is, the function processes each element of src as follows:

    函数LUT使用查找表中的值填充输出数组。 条目的索引取自输入数组。

    也就是说,该函数按以下方式处理src的每个元素:

    .   \f[\texttt{dst} (I)  \leftarrow \texttt{lut(src(I) + d)}\f]

    .   where

    .   \f[d =  \fork{0}{if \(\texttt{src}\) has depth \(\texttt{CV_8U}\)}{128}{if \(\texttt{src}\) has depth \(\texttt{CV_8S}\)}\f]

    .   @param src input array of 8-bit elements. 8位元素的输入数组。

     

    .   @param lut look-up table of 256 elements; in case of multi-channel input array, the table should

    .   either have a single channel (in this case the same table is used for all channels) or the same

    .   number of channels as in the input array.

    256个元素的查询表;

    如果是多通道输入数组,则该表应具有单个通道

    (在这种情况下,所有通道都使用相同的表)或与输入阵列中的通道数相同。

     

    .   @param dst output array of the same size and number of channels as src, and the same depth as lut.

    输出数组,其大小和通道数与src相同,深度与lut相同。

    .   @sa  convertScaleAbs, Mat::convertTo

    """

    pass

首先读取图片,然后灰度化,最后转化为数组

1

2

3

4

5

6

7

8

9

import numpy as np

form PIL import Image

 

# 使用PIL库中的Image模块

# L = 0.299R + 0.587G + 0.114B

img2 = Image.open(photo_file)

grey_img2 = img2.convert('L')

grey_img22 = np.array(grey_img2)

print(type(grey_img22))

  使用python中的图像处理库PIL来实现不同图像格式的转化,对于彩色图像,不管其图像格式是PNG,还是BMP,还是JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。而对于灰度图像,不管其图像格式是PNG,还是BMP,或者JPG,打开后,其模式为“L”。

参考文献:

https://blog.youkuaiyun.com/Rothwale/article/details/79189032

https://blog.youkuaiyun.com/Eastmount/article/details/88785768

 https://blog.youkuaiyun.com/akadiao/article/details/79679306

https://blog.youkuaiyun.com/Eastmount/article/details/88858696

 https://blog.youkuaiyun.com/Eastmount/article/details/88929290

  


更多精彩内容请访问FlyAI-AI竞赛服务平台;为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台;每周免费提供项目开源算法样例,支持算法能力变现以及快速的迭代算法模型。

挑战者,都在FlyAI!!!

OpenCV图像增强实战:灰度变换核心算法与应用场景全解析 本文深入解析OpenCV中的图像灰度变换技术,包括线性变换和非线性变换的核心算法及其应用场景。通过医疗影像增强、工业检测优化等实战案例,展示如何利用灰度变换提升图像对比度,解决实际工作中的图像处理难题。特别适合计算机视觉开发者和图像处理工程师参考实践。 阅读详情

相关推荐

OpenCV灰度变换与直方图处理实战指南

图像处理是计算机视觉的基础技术,其中灰度变换和直方图处理作为核心方法,通过调整像素值分布实现图像增强。灰度变换通过线性或非线性映射改变图像对比度和亮度,而直方图处理则优化像素分布以提升图像质量。这些技术在工业质检、医疗影像和安防监控等领域具有重要应用价值。OpenCV作为主流计算机视觉库,提供了高效的灰度变换和直方图均衡化实现。通过合理选择参数和优化算法,可以在PCB缺陷检测等工业场景中显著提升检测精度和效率。本文结合工业级案例,详细解析灰度变换的工程实现和直方图处理的深度优化技巧。

shirlly 386

图像处理 | 灰度线性变换与非线性变化

一、灰度线性变换 图像的灰度线性变换是通过建立灰度映射来调整原始图像的灰度,从而改善图像的质量,凸显图像的细节,提高图像的对比度。灰度线性变换的计算公式如下所示 g(x)=αf(x)+β (1)图像灰度上移变换:DB=DA + 50 (2)图像对比度增强变换:DB=DA * 1.5 (3)图像对比度减弱变换:DB=DA * 0.8 (4)图像灰度反色变换:DB=255 - DA 注意:由于图像...

Awwwze的博客 1万+

[Python图像处理] 十五.图像的灰度线性变换

前一篇文章讲解了图像灰度化处理的知识,结合OpenCV调用cv2.cvtColor()函数实现图像灰度操作,使用像素处理方法对图像进行灰度化处理。本文主要讲解灰度线性变换,基础性知识希望对您有所帮助。 1.图像灰度上移变换:DB=DA+50 2.图像对比度增强变换:DB=DA*1.5 3.图像对比度减弱变换:DB=DA*0.8 4.图像灰度反色变换:DB=255-DA

杨秀璋的专栏 1万+

从零开始学OpenCV——图像灰度变换详解(线性与非线性变换)

在实际应用中,为了突出图像中感兴趣的研究对象,常常要求增强某一灰度范围的对比度,或对不同范围的灰度值进行不同的处理,即分段线性拉伸。分段线性拉伸是仅将某一范围的灰度值进行拉伸,而其余范围的灰度值实际上被压缩了。阈值变换可以将灰度图像转换成黑白二值图像,用户指定一阈值T,灰度低于T置0,高于T置255。伽玛变换又称为 指数变换 或 幂次变换,是另一种常用的灰度非线性变换。输出图象每个象素点的灰度值仅由输入图像相同位置象素点的灰度值决定。时,该灰度变换是线性的,此时通过线性方式改变原图像。

ai领域探索者,欢迎一起交流,目前从事具身智能行业。 1万+

[Python从零到壹] 四十五.图像增强及运算篇之图像灰度非线性变换详解

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍。第二部分将讲解图像运算和图像增强,上一篇文章介绍图像灰度线性变换,包括灰度上移、对比度增强、对比度减弱和灰度反色变换。这篇文章将详细讲解图像灰度非线性变换。图像灰度非线性变换主要包括对数变换、幂次变换、指数变换、分段函数变换,通过非线性关系对图像进行灰度处理,希望您喜欢

杨秀璋的专栏 8162

图像灰度化技术全面解析与实践指南

图像灰度变换是数字图像处理领域中一项基础而关键的技术。它通过改变图像的亮度值,增强或减弱图像的视觉效果,从而达到突出图像特征、改善视觉效果的目的。直方图是图像处理中一种常用的统计图表,它能够表示图像中像素强度的分布情况。在灰度图像中,直方图显示了每个可能的灰度级的像素数,通常用横轴表示像素强度级别,纵轴表示对应像素的数量。直方图的形状提供了关于图像的亮度、对比度和动态范围的信息。均衡化直方图的目的是为了将图像的直方图分布得更均匀,从而增强图像的全局对比度。

weixin_36311421的博客 1232

数字图像灰度变换(基于opencv)

空间域指的是图像平面本身,空间域中的图像处理方法直接对图像中的像素进行处理。灰度变换是一种常见的数字图像处理技术,旨在空间域中调整图像像素的灰度值,以改善图像质量或实现特定的视觉效果。在空间域处理基于:其中,f(x,y)是输入图像,g(x,y)是输出图像,T是在点(x,y)领域上定义的针对f的变换矩阵(算子)。

jamesnoah的博客 1309

从SSTS到CTS:解码汽车电子架构中的需求与实现规范

本文深入解析汽车电子架构中SSTS(子系统功能规范)与CTS(零部件技术规范)的转换过程,揭示从抽象需求到物理实现的关键步骤。通过实际案例说明如何将SSTS的功能逻辑、接口定义和性能指标转化为具体的CTS实施方案,并分享多供应商协同与测试验证的最佳实践,帮助开发者高效完成汽车电子系统开发。

weixin_29201859的博客 500

yuv 图像处理是不是只处理灰度_Python 图像处理实战 | 图像的灰度非线性变换之对数变换、伽马变换...

作者 | 杨秀璋来源 | 优快云博客责编 | 夕颜头图 | 付费下载自视觉中国出品 | 优快云(ID:优快云news)本篇文章主要讲解非线性变换,使用自定义方法对图像进行灰度化处理,包括对数变换和伽马变换。本文主要讲解灰度线性变换,基础性知识希望对你有所帮助。1.图像灰度非线性变换:DB=DA×DA/2552.图像灰度对数变换3.图像灰度伽玛变换图像灰度非线性变换:DB=DA×DA/255图...

weixin_39958019的博客 253

STM32 | DMA配置和使用如此简单(超详细)

DMA学习很难吗?其实DMA配置和使用如此简单!本文让你无论在DMA认识和理解上(抽象不抽象都有)还是在DMA配置和使用上有个彻彻底底的认识。文章包括寄存器和库函数讲解,省去你自行翻阅使用手册和固件库手册,点到点教会你DMA的配置和使用。

。。。 7万+

深入解析set_clock_groups:异步时钟约束的最佳实践与陷阱规避

本文深入解析了FPGA/芯片设计中set_clock_groups命令在异步时钟约束中的核心作用与最佳实践。文章对比了同步时钟、异步时钟与不重叠时钟的区别,强调了正确使用set_clock_groups避免时序分析陷阱的重要性,并提供了与set_false_path的优先级差异分析及实战规避方法,帮助设计者确保时序收敛与电路可靠性。

weixin_29232121的博客 375

【youcans的OpenCV例程300篇】总目录

【youcans 的 OpenCV 例程300篇】总目录 转载本系列作品时必须标注以下版权内容:必须标注以下版权内容: youcans@qq.com, 【youcans 的 OpenCV 例程】, https://blog.youkuaiyun.com/youcans/category_11459626.html......................................................

youcans的博客 7万+

SAP ABAP干货:用REUSE_ALV_GRID_DISPLAY_LVC实现ALV多屏幕独立布局(含handle参数详解)

本文详细解析了SAP ABAP中如何使用REUSE_ALV_GRID_DISPLAY_LVC函数实现ALV多屏幕独立布局,重点介绍了handle参数的技术原理和实际应用。通过变式标识符和LTDX表存储机制,开发者可以确保不同ALV报表屏幕的布局设置互不干扰,提升复杂报表场景下的用户体验。

weixin_29268267的博客 310

图像灰度变换:从原理到实战,让图像 “整容级” 焕新的核心技术

灰度变换是数字图像处理中提升图像质量的高效技术,通过对像素明暗值进行函数映射(0-255范围)实现对比度增强和细节优化。主要包括三类方法:1)线性变换通过斜率截距调整整体明暗;2)分段线性变换针对不同灰度区间精细调控;3)非线性变换(对数/伽马)解决复杂光照问题,如对数变换凸显暗部、伽马变换定向调节亮度。该技术广泛应用于医学影像、工业检测等领域,配合OpenCV等工具可快速实现"一键焕新"效果,是图像增强的基础核心技术。

nnn__nnn的博客 759

MDB协议中设备级别和选项(Levels and Options)

MDB协议的LEVEL级别介绍

hbstart的博客 939

LVGL的基础知识总结

另外,还有自定义字库的使用,具体可参考开发手册。

qq_28576837的博客 7390

灰度变换与阈值化:从像素映射到图像二值化的核心操作【计算机视觉】

本文围绕图像灰度变换与阈值化二值化技术方向核心本质关键方法适用场景实践注意事项灰度变换通过点运算映射函数sTrs=T(r)sTr优化图像对比度与明暗分布线性变换(对比度增强、反转)非线性变换(对数、伽马)分段灰度变换直方图均衡化/匹配1. 图像对比度低、灰度分布集中2. 需要统一多图灰度风格直方图均衡化易放大噪声,可配合滤波使用阈值化二值化设定阈值TTT,将灰度图转换为黑白二值图,实现前景与背景分离全局阈值化(手动/自动)Otsu阈值化自适应阈值化(均值/高斯)

Sagittarius_A*的博客 956

塔石DTU通过MQTT传递数据教程

塔石通过MQTT通讯上传ADL400电表用电量。

renkai721的专栏 253

OpenCV 4.8 图像增强实战:3种灰度变换算法对比与直方图均衡化效果量化

本文详细对比了OpenCV 4.8中三种灰度变换算法(线性变换、对数变换、幂次变换)与直方图均衡化在图像增强中的效果,通过PSNR、SSIM等量化指标进行客观评价。提供可复现的代码示例和参数调优建议,帮助开发者快速掌握计算机视觉中的图像处理技术,适用于医疗影像、工业检测等场景。

weixin_34175509的博客 297

Vulkan入门系列3 - 绘制三角形代码解析(全)

【代码】Vulkan入门系列3 - 绘制三角形完整代码(带详细注释)

GPU全栈博主 1034

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

OpenCV4X学习-灰度变化、直方图

摘要:本文介绍了灰度图像处理的基本概念和方法。灰度图像通过单通道表示像素亮度(0-255),直方图则统计不同灰度级的像素分布。图像点运算包括灰度变换(线性/非线性)和直方图修正(均衡化/规定化),可改善图像质量。对比度反映图像明暗差异程度,可通过量化最大最小灰度差来评估。文章还提供了OpenCV实现的灰度变换代码,包括线性变换、分段线性变换和对数变换,这些方法能有效调整图像亮度分布和增强细节。

qq_43441284的博客 765

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

数字图像处理实验全解析:从灰度变换到频域分析

本文系统介绍了数字图像处理的核心技术,包括灰度变换、代数运算、直方图处理和频域变换五大模块。通过Python代码实现,详细演示了线性变换、对数变换、伽马变换等图像处理方法,以及直方图均衡化和傅里叶变换等关键算法。实验结果表明,不同技术适用于不同场景:灰度变换调整对比度亮度,代数运算实现图像融合检测,直方图均衡化增强低对比度图像,频域滤波则擅长去噪和特征提取。文章还探讨了算法选择建议和未来发展方向,为图像处理技术在各领域的应用提供了重要参考。

2401_88609403的博客 964

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

灰度图像处理与OpenCV直方图均衡化实战

灰度图像处理是计算机视觉的基础技术,通过单通道像素值记录亮度信息,广泛应用于医学影像、工业检测等领域。其核心原理包括灰度变换和直方图分析,其中直方图均衡化能有效增强图像对比度。OpenCV作为主流计算机视觉库,提供了calcHist等高效函数实现。工程实践中,结合伽马校正和CLAHE算法可以优化处理效果。本文通过实际代码示例,详细解析灰度图像处理的关键技术,包括直方图均衡化实现、查找表优化等性能提升技巧,帮助开发者掌握这一基础而重要的图像处理能力。

diankui6178的博客 359

Python OpenCV图像处理 理论 & 代码

GitHub - LeBron-Jian/ComputerVisionPracticeOpenCV计算机视觉学习(1)——图像基本操作(图像视频读取,ROI区域截取,常用cv函数解释) - 战争热诚 - 博客园ComputerVisionPractice/ImageProcessing_1 at master · LeBron-Jian/ComputerVisionPractice · GitHubOpenCV计算机视觉学习(2)——图像算术运算 &图像阈值(数值计算,掩膜mask操作,边界填充,二值化)

m0_61899108的博客 843

基于OpenCV的图像增强技术从理论到实践的完整指南

图像增强是计算机视觉应用中不可或缺的预处理步骤。通过OpenCV这一强大工具,我们可以从简单的对比度调整到复杂的自适应直方图均衡化,从空间域到频率域,系统地实施各种增强策略。掌握这些技术的关键在于理解其背后的原理,并通过大量的实践来把握不同方法、不同参数对最终效果的影响。随着经验的积累,开发者将能够针对特定的应用场景(如医疗影像、自动驾驶、安防监控等),设计和优化出最有效的图像增强流程,从而为后续的目标检测、识别与理解任务奠定坚实的基础。

z45658的博客 931
上一篇: OpenCV计算机视觉学习(2)——图像算术运算 &图像阈值(数值计算,掩膜mask操作,边界填充,二值化)
下一篇: OpenCV计算机视觉学习(4)——图像平滑处理(均值滤波,高斯滤波,中值滤波,双边滤波)
iFlyAI
博客等级 码龄9年 238粉丝 134原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值