前期准备

pip install opencv-python
pip install numpy

灰度反转

灰度级在区间[0,L-1]内的反转图像的形式为:s=L-1-r

思路:

彩色图像->灰度图像->最大灰度值(255)-原始图像

在彩色图像中,每个像素由红色(R)、绿色(G)和蓝色(B)三个颜色通道组成。而在灰度图像中,每个像素只有一个单一的值,表示该像素的亮度或灰度级别,范围通常从0到255,其中0表示黑色,255表示白色。

img = cv2.imread('gray.png', 1)以彩色模式加载图像,灰度图也会被认为是彩色图。
cv2.imshow('img', img),第一个参数'img'是显示窗口的名称,第二个参数'img'是要显示的图像数据。
img.shape 用于获取图像的尺寸信息,如果'img'是彩色图像,则返回三个值的元组(高,宽,通道数).如果'img'是灰度图像,则返回元组的高和宽。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)彩色图转灰度图
cv2.waitKey(0)保持显示窗口,直到用户按下任意键

代码:

#灰度反转
import cv2

# opencv读取图像
img = cv2.imread('gray.png', 1)

#检查图像是否成功加载
if img is not None:
    cv2.imshow('img', img)

    # 得到图像的尺寸
    img_shape = img.shape  # 图像大小(518, 921, 3)
    print("Original image shape:",img_shape)

    # 彩色图像转换为灰度图像(3通道变为1通道)
    #将每个像素的RGB值转换为一个单一的灰度值
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    print("Gray image shape:",gray.shape)


    # 最大图像灰度值减去原图像,即可得到反转的图像
    inverted_image = 255 - gray
    cv2.imshow('Inverted Image', inverted_image)
    cv2.waitKey(0)
else:
    print("Failed to load image.")

 以下这个彩色图可以看的更加明显一点。

import cv2

# opencv读取图像
img = cv2.imread('rgb.png', 1)

#检查图像是否成功加载
if img is not None:
    cv2.imshow('img', img)

    # 得到图像的尺寸
    img_shape = img.shape  # 图像大小
    print("Original image shape:",img_shape)
    # 得到宽高
    height = img_shape[0]
    wide = img_shape[1]

    # 彩色图像转换为灰度图像(3通道变为1通道)
    #将每个像素的RGB值转换为一个单一的灰度值
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    print("Gray image shape:",gray.shape)

    cv2.imshow("gray",gray)

    # 最大图像灰度值减去原图像,即可得到反转的图像
    inverted_image = 255 - gray
    cv2.imshow('Inverted Image', inverted_image)
    cv2.waitKey(0)
else:
    print("Failed to load image.")

 对数变换

对数变换的通式为:s=c*log(1+r)

思路:

 彩色图像->灰度图像->c*log*(1+原始图像)->将数值归一化(限定在0~255)

np.log1p(gray)返回 log(1 + gray) 的值。
np.uint8(transformed_image)将值限定在八位二进制(0~255)之间

代码:

当c=1时:

# 对数变换
import cv2
import numpy as np

# opencv读取图像
img = cv2.imread('gray.png', 1)

# 检查图像是否成功加载
if img is not None:
    # 将图像灰度化灰度化
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 对图像进行对数变换c*log(1+x)
    transformed_image = 1 * np.log1p(gray)
    # 将结果缩放到0~255之间 8表示8位,将值限定在0~255之间
    transformed_image = np.uint8(transformed_image)

    # 显示图像
    cv2.imshow('gray', gray)
    cv2.imshow('Log Transformed Image', transformed_image)
    # 窗口保持
    cv2.waitKey(0)
else:
    print("Failed to load image.")

 当c=10时:

 当c=20时:

 当c=30时:

幂律(伽马)变换

幂律变换的形式为:s=c*r^y

思路:

彩色图像->灰度图像->将图像的值缩小到[0,1]->幂律变换->将数值归一化(限定在0~255)

gray=img.astype(np.float32)/255.0 先将图像转换成浮点类型,并将像素值归一到[0,1]范围内
corrected_image=np.power(img,1)img的1次方
corrected_image=(corrected_image*255).astype(np.uint8)和前面一样,先将值重新回到整数范围,之后进行归一化

代码:

当c=255,y=1时:

#伽马变换
import cv2
import numpy as np

# opencv读取图像
img = cv2.imread('gray.png', 1)

# opencv读取图像
img = cv2.imread('gray.png', 1)

# 检查图像是否成功加载
if img is not None:
    # 将图像灰度化灰度化
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    #将图像转换为浮点类型
    gray=img.astype(np.float32)/255.0

    #应用伽马变换
    corrected_image=np.power(img,1)
    #将结果缩放到0~255之间
    corrected_image=(corrected_image*255).astype(np.uint8)

    # 显示图像
    cv2.imshow('Original Image', gray)
    cv2.imshow('Gamma Corrected Image',corrected_image)
    # 窗口保持
    cv2.waitKey(0)
else:
    print("Failed to load image.")

 当c=255,y=10时:

当c=2550,y=1时: 

 当c=1y=1时: 

当c=1,y=2.5时: 

当c=1,y=0.4时: 

参考链接

c++ opencv 图像处理:灰度变换(灰度反转,对数变换,冥律(伽马)变换)_灰度反转csdn-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_44785013/article/details/120181226

python--图像颜色反转_cv2灰度图反色-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/liuyingying0418/article/details/88537652

代码

#图像变换
import cv2
import numpy as np

'''灰度反转 s=L-1-r'''
def gray_inversion(image):
    #最大图像的灰度值减去原图像
    inverted_image=255-image
    return inverted_image

'''对数变换 s=c*log(1+r)'''
def log_transform(image,c=1):
    #对图像进行对数变换
    transformed_image=c*np.log1p(image)
    #将结果缩放到0~255
    transformed_image=np.uint8(transformed_image)
    return transformed_image

'''伽马变换 s=c*r^y'''
def gamma_correction(image, gamma=1.0, c=1.0):
    # 将图像转换为浮点类型
    image = image.astype(np.float32) / 255.0
    # 应用伽马变换
    corrected_image = c * np.power(image, gamma)
    # 将结果缩放到0~255之间
    corrected_image = np.uint8(corrected_image)
    return corrected_image

# opencv读取图像
img = cv2.imread('rgb.png', 1)
# 检查图像是否成功加载
if img is not None:
    # 将图像灰度化灰度化
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    #灰度反转
    inverted_image=gray_inversion(gray)
    #对数变换
    transformed_image=log_transform(gray,20)
    #伽马变换
    corrected_image=gamma_correction(gray,10,255)
    # 显示图像
    cv2.imshow('Original Image', img)
    cv2.imshow('Gray',gray)
    cv2.imshow('Inverted Image',inverted_image)
    cv2.imshow('Log Transformed Image',transformed_image)
    cv2.imshow('Gamma Corrected Image',corrected_image)
    # 窗口保持
    cv2.waitKey(0)
else:
    print("Failed to load image.")

 

假设用彩色图像(gray->img)直接调用函数就会出现:

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐