不玩PS抠图了,改玩Python抠图
网上找了两个苏轼的印章图片:
把这两个印章抠出来的话,对于不少PS高手来说是相当容易,但是要去掉其中的水印,可能要用仿制图章慢慢描绘,图章的边缘也要慢慢勾画或者用通道抠图之类来处理,而且印章的红色也不是很鲜亮,调整颜色也有点麻烦。弄个下面的Python程序,那就秒杀。
import random
import cv2
def remove_background(image_path, red_threshold):
"""
将图片中红色分量低于指定值的点全部变成透明
:param image_path: 图片的路径
:param red_threshold: 红色分量的阈值
:return: 处理后的透明背景红色增强图片(numpy.ndarray类型)
"""
# 读取图片
image = cv2.imread(image_path)
image_rgba = cv2.cvtColor(image, cv2.COLOR_BGR2RGBA)
# 获取图片的高度、宽度和通道数
height, width, channels = image.shape
# 遍历图片中的每个像素点
for i in range(height):
for j in range(width):
# 获取当前像素点的红色分量值
red_value = image[i][j][2]
# 如果红色分量值低于阈值,将该像素点变为透明
if red_value < red_threshold:
image_rgba[i][j] = [0, 0, 0, 0]
else:
# 考虑到现实中的红色未必都是纯红,生成一种随机的比较鲜艳的红色填充红色区域。这样水印自然消掉了
red_value = random.randint(248, 255)
green_value = random.randint(0, 8)
blue_value = random.randint(0, 5)
image_rgba[i][j] = [blue_value, green_value, red_value, 255]
return image_rgba
if __name__ == '__main__':
file_path = 'meiyang.jpg'
image = remove_background(file_path, red_threshold=127)
cv2.imwrite('meiyang.png', image)
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
抠图效果展示(右下角CSDN添加的水印别怪我,看不出透明背景别怪我):
其实只要前景色中没有混杂背景色,如果前景色和背景色差异较大或者转换为灰度图片后前景色与背景色灰度值相差明显,就可以稍微修改一下上面的代码将背景改成透明的,从而完成抠图。背景色不是纯黑纯白时可传入红绿蓝三个分量的阈值,转换为灰度图片后前景色与背景色灰度值相差明显时可先转换成灰度图片后二值化作为掩码图片,利用掩码图片消除原始图片上的背景。
话说苏东坡是白字先生,“士”字多刻了两笔🐶。