Python调用OpenCV实现图像反色(反相)处理

1 前言

上一篇介绍了用C++如何将一幅彩色图像和灰度图像进行反色处理,本篇接着用python来做同样的事情。

图像反转,其目的就是增强图像的暗区中白色或灰色的细节,特别是原图中的阴影黑色区域。原理就是用值255 减去原来像素点上的像素值,比如用255(白色)-0(黑色)得到的是255(白色)。

2 相关概念

像素:像素是图像的最小单位。每一幅图像都是由M行N列的像素组成的,其中每一个像素都存储一个像素值。

RGB 图像:

每一种颜色在视觉效果上都可以由不同比例的红、绿、蓝三种颜色合成(R-red,G-green,B-blue)。RGB图像存在3个通道,即R通道、G通道和B通道。其中R通道指的是红色通道;G通道指的是绿色通道;B通道指的是蓝色通道;并且每个色彩通道都在区间[0,255]内取值。RGB图像对应的是RGB色彩空间。

灰度图像:

每个像素都是从黑到白,被处理为256个灰度级别的单色图像。这256个灰度级别分别用区间[0,255]中的数值表示。其中,”0″表示纯黑色,”255″表示纯白色,0~255的数值表示不同亮度(即色彩的深浅程度)的深灰色或者浅灰色。灰度图像对应的是GRAY色彩空间。

BGR 色彩空间:

在RGB色彩空间中,彩色图像的通道顺序是R -> G -> B,但是在OpenCV中,RGB色彩空间被BGR色彩空间取代,使得彩色图像的通道顺序变成了B -> G -> R,与RGB刚好相反。

3 创建测试项目

创建测试项目、配置开发环境,具体可参考之前文章,这里就不多说了

Win10+Python3.10+OpenCV4.6.0加载显示图片_来灵的博客-CSDN博客

这次测试项目名称img_invert,VS2022种创建好的项目截图

Python调用OpenCV实现图像反色(反相)处理

将下列代码编辑到img_invert.py文件里,代码中有详细的注释

!usr/bin/env python
-*- coding: utf-8 -*-
import cv2
import numpy as np

#color_path:彩色图片路径
#gray_path:灰度图片路径
#dst_color_path:反色后的彩色图片路径
#dst_gray_path:反色后的灰度图片路径
def img_invert(color_path, gray_path, dst_color_path, dst_gray_path):
    #打开彩色原始图像
    img_color = cv2.imread(color_path)
    #获取彩色图像宽、高、通道数
    height_color, width_color, channels_color = img_color.shape
    #打印彩色图像的宽、高、通道数
    print("color:width[%d],height[%d],channels[%d]" % (width_color, height_color, channels_color))

    #将彩色图像转换成灰度图像
    #注意参数2:OpenCV中彩色色彩空间是BGR,转换成灰度色彩空间GRAY
    img_gray = cv2.cvtColor(img_color, cv2.COLOR_BGR2GRAY)
    #获取灰度图像宽、高、通道数
    #height_gray, width_gray = img_gray.shape
    height_gray, width_gray = img_gray.shape[:2]
    #打印彩色图像的宽、高、通道数
    print("gray:width[%d],height[%d]" % (width_gray, height_gray))
    #保存灰度图片
    cv2.imwrite(gray_path, img_gray)

    #显示转换之前的彩色图像和灰度图像
    cv2.imshow('img_color', img_color)
    cv2.imshow('img_gray', img_gray)

    #先将彩色图像反色
    #创建空白数组
    for row in range(height_color):
        for col in range(width_color):
            for chan in range(channels_color):
                point = img_color[row, col, chan]
                img_color[row, col, chan] = 255 - point

    #显示和保存反色后彩色图像
    cv2.imshow('dst_color', img_color)
    cv2.imwrite(dst_color_path, img_color)

    #接着讲灰度图像反色
    #创建空白数组
    for row in range(height_gray):
        for col in range(width_gray):
            img_gray[row][col] = 255 - img_gray[row][col]

    #显示和保存反色后灰度图像
    cv2.imshow('dst_gray', img_gray)
    cv2.imwrite(dst_gray_path, img_gray)

    #按下任何键盘按键后退出
    cv2.waitKey()
    #销毁所有窗口
    cv2.destroyAllWindows()
    print("test end...")

if __name__ == '__main__':
    color_path = 'color.jpg'
    gray_path = 'gray.jpg'
    dst_color_path = 'dst_color.jpg'
    dst_gray_path = 'dst_gray.jpg'
    img_invert(color_path, gray_path, dst_color_path, dst_gray_path)

编辑好代码的项目截图

Python调用OpenCV实现图像反色(反相)处理

测试项目工程当前目录

Python调用OpenCV实现图像反色(反相)处理

4 效果截图

Python调用OpenCV实现图像反色(反相)处理

控制台运行截图

Python调用OpenCV实现图像反色(反相)处理

彩色和灰度原图

Python调用OpenCV实现图像反色(反相)处理

反色处理后保存的图片

Python调用OpenCV实现图像反色(反相)处理

5 总结

1,不论是对彩色图像还是灰度图像,做反转处理的原理都是一样的,即用255减去像素点上的RGB值。不同点:彩色图像是3通道,灰度图像是单通道。

Value(目标) = 255 – Value(当前)

2,将彩色图像转换成灰度图像,使用了OpenCV的接口函数

gray = cv2.cvtColor (color, cv2.COLOR_BGR2GRAY);

参数说明:

color 转换前的图像(即彩色图像)

code 色彩空间转换码(本示例用的是COLOR_BGR2GRAY)

返回值:

gray:转换后的图像(即灰度图像)

Original: https://blog.csdn.net/chexlong/article/details/127335879
Author: 来灵
Title: Python调用OpenCV实现图像反色(反相)处理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/637367/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球