请问怎样按色差抠图
本帖最后由 wgij007 于 2022-9-15 08:16 编辑如上图,把与背景不一样的所有图块,以正方形抠出来(以长边为边长),抠出来图块与边上保留像素(也就是不靠在图片的边上),另存多张图片。可以批量处理多张图片(都是一样底色,里有多个图块)。底色那个值最好有一个范围可设。
感激帮忙。
确实不好整
#!/usr/bin/env python
#coding=utf-8
from PIL import Image
import numpy as np
import sys
bg_color = (0, 0, 0xfe)
def max(a, b): return a if a > b else b
def min(a, b): return a if a < b else b
def is_background(pic, y, x, tolerance = 0x30):
color = pic.getpixel((x, y))
for i in range(3):
if bg_color + tolerance < color: return False
if bg_color - tolerance > color: return False
return True
def is_contain(location, y, x):
for i in location:
if (i <= x <= i) and (i <= y <= i): return True
return False
def find_block_sub(y, x, buff):
if is_background(pic, y, x): return None
if buff: return None
result =
buff = 1
for i in [, [-1, 0], , ]:
temp = find_block_sub(y + i, x + i, buff)
if temp:
result = min(result, temp)
result = min(result, temp)
result = max(result, temp)
result = max(result, temp)
#buff = 0 # 我感觉不复位,对这个程序也问题不大
return result
def find_block(y, x): return find_block_sub(y, x, np.zeros((height, width)))
def format(location, margin = 5):
for i in location:
i -= margin
i -= margin
i += margin
i += margin
width = i - i
height = i - i
distance = abs(width - height) / 2
if width == height: continue
if width > height:
i -= distance
i += distance
else:
i -= distance
i += distance
sys.setrecursionlimit(10000)
location = []
pic = Image.open("pic.jpg")
width, height = pic.size
for y in range(height):
for x in range(width):
if not is_background(pic, y, x):
if not is_contain(location, y, x):
location.append(find_block(y, x))
format(location)
for i in range(len(location)):
pic.crop(location).save(str(i) + ".png")
顶一下,有点难 用爬虫,让网站抠完后用爬虫下载下来 人造人 发表于 2022-8-24 10:11
确实不好整
老大,了不起呀!请问怎样可以做成批量呀,一个文件夹都是这种图,全部要抠出来。 wgij007 发表于 2022-8-24 22:48
老大,了不起呀!请问怎样可以做成批量呀,一个文件夹都是这种图,全部要抠出来。
你能看懂我写的这个代码吗?
代码都给你了,稍微改一改就是你需要的了
这个程序完成了一张图片的处理,你需要做的就是遍历目录下面的图片,然后调用这个程序
人造人 发表于 2022-8-24 22:59
你能看懂我写的这个代码吗?
代码都给你了,稍微改一改就是你需要的了
这个程序完成了一张图片的处理, ...
刚学,不会呀 人造人 发表于 2022-8-24 22:59
你能看懂我写的这个代码吗?
代码都给你了,稍微改一改就是你需要的了
这个程序完成了一张图片的处理, ...
你好,背景色有一点色差,怎样设呀。如230~254
wgij007 发表于 2022-8-25 08:14
你好,背景色有一点色差,怎样设呀。如230~254
这不,只要偏差不超过0x30就认为是背景色
def is_background(pic, y, x, tolerance = 0x30):
color = pic.getpixel((x, y))
for i in range(3):
if bg_color + tolerance < color: return False
if bg_color - tolerance > color: return False
return True #!/usr/bin/env python
#coding=utf-8
from PIL import Image
import numpy as np
import sys
from glob import glob
import os
import shutil
bg_color = (0, 0, 0xfe)
def max(a, b): return a if a > b else b
def min(a, b): return a if a < b else b
def is_background(pic, y, x, tolerance = 0x30):
color = pic.getpixel((x, y))
for i in range(3):
if bg_color + tolerance < color: return False
if bg_color - tolerance > color: return False
return True
def is_contain(location, y, x):
for i in location:
if (i <= x <= i) and (i <= y <= i): return True
return False
def find_block_sub(pic, y, x, buff):
if is_background(pic, y, x): return None
if buff: return None
result =
buff = 1
for i in [, [-1, 0], , ]:
temp = find_block_sub(pic, y + i, x + i, buff)
if temp:
result = min(result, temp)
result = min(result, temp)
result = max(result, temp)
result = max(result, temp)
#buff = 0 # 我感觉不复位,对这个程序也问题不大
return result
def find_block(pic, y, x, size): return find_block_sub(pic, y, x, np.zeros(size))
def format(location, margin = 5):
for i in location:
i -= margin
i -= margin
i += margin
i += margin
width = i - i
height = i - i
distance = abs(width - height) / 2
if width == height: continue
if width > height:
i -= distance
i += distance
else:
i -= distance
i += distance
def generate_pic(result_path, filename):
location = []
pic = Image.open(filename)
width, height = pic.size
for y in range(height):
for x in range(width):
if not is_background(pic, y, x):
if not is_contain(location, y, x):
location.append(find_block(pic, y, x, (height, width)))
format(location)
for i in range(len(location)):
pic.crop(location).save(result_path + "/" + str(i) + ".jpg")
sys.setrecursionlimit(10000)
for i in glob("pic/*.jpg"):
filename = os.path.splitext(os.path.split(i)[-1])
shutil.rmtree("result/" + filename)
os.mkdir("result/" + filename)
generate_pic("result/" + filename, i)
人造人 发表于 2022-8-25 10:05
老大,这输入路径在那了,没找到呀 人造人 发表于 2022-8-25 10:05
请问能不能直接读取某一个像素的值呢,如,10,10 这样 wgij007 发表于 2022-8-26 08:04
老大,这输入路径在那了,没找到呀
for i in glob("pic/*.jpg"): wgij007 发表于 2022-8-26 08:13
请问能不能直接读取某一个像素的值呢,如,10,10 这样
color = pic.getpixel((x, y)) 人造人 发表于 2022-8-26 09:09
for i in glob("d:/aaa/1/*.jpg"): 一改就出错了
Traceback (most recent call last):
File "抠图.py", line 81, in <module>
shutil.rmtree("result/" + filename)
File "D:\Program Files\Python37\lib\shutil.py", line 516, in rmtree
return _rmtree_unsafe(path, onerror)
File "D:\Program Files\Python37\lib\shutil.py", line 377, in _rmtree_unsafe
onerror(os.scandir, path, sys.exc_info())
File "D:\Program Files\Python37\lib\shutil.py", line 374, in _rmtree_unsafe
with os.scandir(path) as scandir_it:
FileNotFoundError: 系统找不到指定的路径。: 'result/001' wgij007 发表于 2022-8-26 18:50
for i in glob("d:/aaa/1/*.jpg"): 一改就出错了
Traceback (most recent call last):
我把结果存在result这个目录
我没有用代码创建这个目录,你自己创建一下 人造人 发表于 2022-8-26 20:02
我把结果存在result这个目录
我没有用代码创建这个目录,你自己创建一下
好的,还是不慬,但非常感谢你。我自己摸索一下先。 人造人 发表于 2022-8-26 20:02
我把结果存在result这个目录
我没有用代码创建这个目录,你自己创建一下
在pic里没有图片,就不报错,有图片就报错。result文件夹已创建了。
wgij007 发表于 2022-8-26 22:46
在pic里没有图片,就不报错,有图片就报错。result文件夹已创建了。
报错信息? 人造人 发表于 2022-8-26 23:04
报错信息?
这个PIC文件夹里有图片的。
这个没有图片,空的
页:
[1]
2