You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python+OpenCV实现类似Photoshop按透明像素裁剪图片功能

解决方案

你需要的等效Photoshop「基于透明像素修剪」功能,可以通过计算alpha通道非透明区域的最小外接矩形实现,该方法通用,适配任意形状、尺寸的遮罩,修改后的完整代码如下:

import cv2
import numpy as np

# 加载带alpha通道的遮罩素材,使用IMREAD_UNCHANGED确保读取alpha通道
image = cv2.imread('rama1.png', cv2.IMREAD_UNCHANGED)    
poza = cv2.imread("poza1.jpg")

# 调整遮罩尺寸和原图匹配
image = cv2.resize(image, poza.shape[1::-1])

# 生成透明区域掩码
trans_mask = image[:,:,3] != 0

# 将遮罩的不透明区域设为全黑透明
image[trans_mask] = [0, 0, 0, 0]

# 提取遮罩的灰度图用于阈值处理
new_img = cv2.cvtColor(image, cv2.COLOR_BGRA2BGR)
thresh, image_black = cv2.threshold(new_img, 200, 255, cv2.THRESH_BINARY) 
image_black = cv2.cvtColor(image_black, cv2.COLOR_BGR2GRAY)

# 给原图应用遮罩
final = cv2.bitwise_and(poza, poza, mask=image_black)

# 转换为带alpha通道的格式,将掩码设为alpha值
final = cv2.cvtColor(final, cv2.COLOR_BGR2BGRA)
final[:,:,3] = image_black

# ------------ 新增:基于透明像素裁剪逻辑 ------------
# 提取alpha通道中所有非透明像素的坐标
non_zero_points = cv2.findNonZero(final[:, :, 3])
# 计算非透明区域的最小外接矩形,返回左上角坐标x、y,宽度w、高度h
x, y, w, h = cv2.boundingRect(non_zero_points)
# 按外接矩形裁剪得到最终结果
cropped_final = final[y:y+h, x:x+w]
# ---------------------------------------------------

# 保存、展示裁剪后的结果
cv2.imwrite('result_cropped.png', cropped_final)
cv2.imshow('cropped result', cropped_final)
cv2.waitKey(0)
cv2.destroyAllWindows()

核心逻辑说明:

  • cv2.findNonZero会筛选出alpha通道中所有值大于0的不透明像素的坐标
  • cv2.boundingRect会自动计算能包含所有不透明像素的最小矩形边界
  • 按计算得到的矩形坐标裁剪图像,即可得到移除了四周多余透明边框的效果

内容的提问来源于stack exchange,提问作者Lapoco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 15:54:05