实际对图片进行处理的时候,经常会碰到单一颜色背景的情况,这时候就可以采用图像处理的方法,将该单一颜色去除,形成一个透明的图片。如果需要,还可以加上新的背景图,图片就焕然一新了。
删除图片某种颜色,Pillow或OpenCV都可以实现。实现的思路都是一致的,就是将图片转换为带透明通道的格式,然后设置透明度为0。
Pillow库的实现,采用image.convert('RGBA'),然后查找相应的颜色,最后设置透明通道为0
OpenCV库的实现,采用cv2.cvtColor(img1, cv2.COLOR_BGR2BGRA),然后查找相应的颜色,最后设置透明通道为0。
以下是实现的效果,图一是原图,图二是pillow去除背景后的图,图三是OpenCV支除背景后的图。刚好去除的背景颜色为(237,237,237)。
在代码运行过程中,发现用pillow的实现速度,要比OpenCV要快速很多,比较建议使用。下面是图片与实现代码。
import cv2
from PIL import Image
def calc_diff(pixel, bg_color):
# 计算pixel与背景的离差平方和,作为当前像素点与背景相似程度的度量
return (pixel[0] - bg_color[0]) ** 2 + (pixel[1] - bg_color[1]) ** 2 + (pixel[2] - bg_color[2]) ** 2
def remove_one_color_opencv(): # 采用opencv方式
delete_color = [237, 237, 237]
threshold = 13
image_path = "example3.png"
img1 = cv2.imread(image_path)
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2BGRA) # 将图像转成带透明通道的BGRA格式
for i in range(img1.shape[0]):
for j in range(img1.shape[1]):
if calc_diff(img1[i][j], delete_color) < threshold:
img1[i][j] = (255, 255, 255, 0)
cv2.imwrite("output2.png", img1)
def remove_one_color_pillow(): # 采用pillow方式
delete_color = [237, 237, 237]
threshold = 13
image_path = "example3.png"
img2 = Image.open(image_path)
img2 = img2.convert('RGBA')
pixdata = img2.load()
for y in range(img2.size[1]):
for x in range(img2.size[0]):
if calc_diff(pixdata[x, y], delete_color) < threshold:
pixdata[x, y] = (255, 255, 255, 0)
img2.save("output1.png")
if __name__ == '__main__':
remove_one_color_pillow()
remove_one_color_opencv()
最近在使用OpenCV写毕业设计,接触图像编程不久。学习时也遇到一些困惑,在此与大家分享一下。
OpenCV分离RGB颜色通道。示例图:分离出来的效果图如下:程序源代码:#include "cv.h"'
#include "cxcore.h"
#include "highgui.h"
#include
using namespace std;
int main ()
IplImage*
在图像处理时,我们接触到的彩色以RGB居多,为了分析图像在某一通道上的特性,需要将图像的颜色通道进行分离,或者是在对某一颜色通道处理后重新进行融合。opencv提供了split()函数来进行颜色通道的分离,提供了merge()函数来进行颜色通道的融合。1.split()函数
颜色通道分离函数,其定义如下所示:CV_EXPORTS void split(const Mat& src, Mat* mv
opencv去除图片中某一颜色(python实现)
一 打开图片
打开图片的时候最好使用windows自带的“画图”软件查看(在画图软件下通过句柄精灵获得点的RGB值与opencv中获得的是一样的),在“画图”的左下角可以看到图像中某个点的坐标值如(344,123),如果要在opencv中处理该点的话,需要把坐标值反一下即 img[123, 344]才能取得该点
二 使用句柄精灵等软件获得想要改变的颜色的RGB值
需要注意的是opencv中的R与B通道是反着的(后面代码中有相应说明)
def Resize_Pil(img_file_name):
imgFile = Image.open(img_file_name)
print (imgFile.size) # (828, 1471)
newImg = imgFile.resize((1080, 1080), Image.B
利用python实现图片的横向和纵向拼接,实现起来主要有Pillow或OpenCV两个方法。两个代码略有不同,实现起来也还算简单。主要知识点是:
Pillow实现:主要采用crop,实现图片截取、采用paste,实现图片拼接。
OpenCV实现:截取直接[],截取需要的区域,采用np.vstack, np.hstack实现纵向,横向拼接。或者np.concatenate实现,通过axis来控制横向纵向。
实现代码如下:
import cv2
import numpy as np
from PIL.
这段代码是一个图像处理程序,它遍历指定目录中的所有PNG图像文件,并将其中的红色和绿色像素替换为白色,将蓝色像素增加。它使用了OpenCV、Pillow和NumPy库来处理图像。
代码首先设置了包含图像的目录路径和输出目录路径,然后获取目录中所有PNG图像文件的列表。接下来,定义了要替换的颜色及其容差,包括红色、绿色和蓝色。然后,遍历每个图像文件,打开图像文件并将其转换为RGB格式。然后,将图像转换为NumPy数组,并将红色和绿色像素替换为白色,将蓝色像素增加。最后,从像素数组创建新图像,并将