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种创建好的项目截图
将下列代码编辑到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)
编辑好代码的项目截图
测试项目工程当前目录
4 效果截图
控制台运行截图
彩色和灰度原图
反色处理后保存的图片
5 总结
1,不论是对彩色图像还是灰度图像,做反转处理的原理都是一样的,即用255减去像素点上的RGB值。不同点:彩色图像是3通道,灰度图像是单通道。
Value(目标) = 255 – Value(当前)
2,将彩色图像转换成灰度图像,使用了OpenCV的接口函数
gray = cv2.cvtColor(color, cv2.COLOR_BGR2GRAY);
参数说明:
color:转换前的图像(即彩色图像)
code:色彩空间转换码(本示例用的是COLOR_BGR2GRAY)
返回值:文章来源:https://www.toymoban.com/news/detail-469033.html
gray:转换后的图像(即灰度图像)文章来源地址https://www.toymoban.com/news/detail-469033.html
到了这里,关于Python调用OpenCV实现图像反色(反相)处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!