鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: wgij007

[已解决]请问怎样按色差抠图

[复制链接]
发表于 2022-8-26 23:43:57 | 显示全部楼层
wgij007 发表于 2022-8-26 23:34
这个PIC文件夹里有图片的。
  这个没有图片,空的

看一下pic和result两个目录下面有什么
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-8-26 23:46:49 | 显示全部楼层
我的问题,抱歉

  1.     shutil.rmtree("result/" + filename, ignore_errors = True)
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-27 00:35:35 | 显示全部楼层

可以了,但每张图都一个独立文件夹整合还要做多一次,如都在一个文件夹最好了。还是非常感谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-8-27 00:45:48 | 显示全部楼层
wgij007 发表于 2022-8-27 00:35
可以了,但每张图都一个独立文件夹整合还要做多一次,如都在一个文件夹最好了。还是非常感谢。
  1. #!/usr/bin/env python
  2. #coding=utf-8

  3. from PIL import Image
  4. import numpy as np
  5. import sys
  6. from glob import glob
  7. import os

  8. bg_color = (0, 0, 0xfe)

  9. def max(a, b): return a if a > b else b
  10. def min(a, b): return a if a < b else b

  11. def is_background(pic, y, x, tolerance = 0x30):
  12.     color = pic.getpixel((x, y))
  13.     for i in range(3):
  14.         if bg_color[i] + tolerance < color[i]: return False
  15.         if bg_color[i] - tolerance > color[i]: return False
  16.     return True

  17. def is_contain(location, y, x):
  18.     for i in location:
  19.         if (i[0] <= x <= i[2]) and (i[1] <= y <= i[3]): return True
  20.     return False

  21. def find_block_sub(pic, y, x, buff):
  22.     if is_background(pic, y, x): return None
  23.     if buff[y][x]: return None
  24.     result = [x, y, x, y]
  25.     buff[y][x] = 1
  26.     for i in [[0, -1], [-1, 0], [0, 1], [1, 0]]:
  27.         temp = find_block_sub(pic, y + i[0], x + i[1], buff)
  28.         if temp:
  29.             result[0] = min(result[0], temp[0])
  30.             result[1] = min(result[1], temp[1])
  31.             result[2] = max(result[2], temp[2])
  32.             result[3] = max(result[3], temp[3])
  33.     #buff[y][x] = 0     # 我感觉不复位,对这个程序也问题不大
  34.     return result

  35. def find_block(pic, y, x, size): return find_block_sub(pic, y, x, np.zeros(size))

  36. def format(location, margin = 5):
  37.     for i in location:
  38.         i[0] -= margin
  39.         i[1] -= margin
  40.         i[2] += margin
  41.         i[3] += margin
  42.         width = i[2] - i[0]
  43.         height = i[3] - i[1]
  44.         distance = abs(width - height) / 2
  45.         if width == height: continue
  46.         if width > height:
  47.             i[1] -= distance
  48.             i[3] += distance
  49.         else:
  50.             i[0] -= distance
  51.             i[2] += distance

  52. def generate_pic(result_path, filename):
  53.     location = []
  54.     pic = Image.open(filename)
  55.     width, height = pic.size
  56.     for y in range(height):
  57.         for x in range(width):
  58.             if not is_background(pic, y, x):
  59.                 if not is_contain(location, y, x):
  60.                     location.append(find_block(pic, y, x, (height, width)))

  61.     format(location)
  62.     for i in range(len(location)):
  63.         pic.crop(location[i]).save(result_path + "_" + str(i) + ".jpg")

  64. sys.setrecursionlimit(10000)
  65. for i in glob("pic/*.jpg"):
  66.     filename = os.path.splitext(os.path.split(i)[-1])[0]
  67.     generate_pic("result/" + filename, i)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-27 08:16:44 | 显示全部楼层

真的非常感谢,只是刚学有点东东不怎么好理解,有的事还真的会的不难,不会的就是不会,可能一点点都会搞好久。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-27 10:22:11 | 显示全部楼层

老大,抠出来的图好多差一1的,如33*34 或 40*39 , 还有靠边那种,补的是黑色的。能补回RGB设定的色吗。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-8-27 12:39:59 | 显示全部楼层
wgij007 发表于 2022-8-27 10:22
老大,抠出来的图好多差一1的,如33*34 或 40*39 , 还有靠边那种,补的是黑色的。能补回RGB设定的色吗。

?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-27 21:11:20 | 显示全部楼层

正常应该是正矩形的,如50*50那样,便抠出来的是50*49或49*50那个,差一像素。还有刚好在边上,那边上那条边就会有一条黑边图,就是补回去的图。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-7 00:01:18 | 显示全部楼层

20220906.jpg

老大,出现这种内侧有同色的就不抠出来了,不用处理内侧,就把黄色与内孔一起抠出(如图),有办法解决吗。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-7 01:03:15 | 显示全部楼层
wgij007 发表于 2022-9-7 00:01
老大,出现这种内侧有同色的就不抠出来了,不用处理内侧,就把黄色与内孔一起抠出(如图),有办法解 ...

不应该,我写代码的时候考虑过这种情况的

tmp.zip (65.11 KB, 下载次数: 1)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-7 23:08:16 | 显示全部楼层
人造人 发表于 2022-9-7 01:03
不应该,我写代码的时候考虑过这种情况的

感谢老大,还是好多不明,慢慢学了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-19 23:27:28 | 显示全部楼层
人造人 发表于 2022-9-7 01:03
不应该,我写代码的时候考虑过这种情况的

xxx.jpg

老大为什么这样的图失败呢。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-19 23:58:57 | 显示全部楼层
wgij007 发表于 2022-9-19 23:27
老大为什么这样的图失败呢。

调试程序呀

  1. #!/usr/bin/env python
  2. #coding=utf-8

  3. from PIL import Image
  4. import numpy as np
  5. import sys

  6. bg_color = (0, 0, 0xfe)

  7. def max(a, b): return a if a > b else b
  8. def min(a, b): return a if a < b else b

  9. def is_background(pic, y, x, tolerance = 0x30):
  10.     color = pic.getpixel((x, y))
  11.     for i in range(3):
  12.         if bg_color[i] + tolerance < color[i]: return False
  13.         if bg_color[i] - tolerance > color[i]: return False
  14.     return True

  15. def is_contain(location, y, x):
  16.     for i in location:
  17.         if (i[0] <= x <= i[2]) and (i[1] <= y <= i[3]): return True
  18.     return False

  19. def find_block_sub(y, x, buff):
  20.     if is_background(pic, y, x): return None
  21.     if buff[y][x]: return None
  22.     result = [x, y, x, y]
  23.     buff[y][x] = 1
  24.     for i in [[0, -1], [-1, 0], [0, 1], [1, 0]]:
  25.         temp = find_block_sub(y + i[0], x + i[1], buff)
  26.         if temp:
  27.             result[0] = min(result[0], temp[0])
  28.             result[1] = min(result[1], temp[1])
  29.             result[2] = max(result[2], temp[2])
  30.             result[3] = max(result[3], temp[3])
  31.     #buff[y][x] = 0     # 我感觉不复位,对这个程序也问题不大
  32.     return result

  33. def find_block(y, x): return find_block_sub(y, x, np.zeros((height, width)))

  34. def format(location, margin = 5):
  35.     for i in location:
  36.         i[0] -= margin
  37.         i[1] -= margin
  38.         i[2] += margin
  39.         i[3] += margin
  40.         width = i[2] - i[0]
  41.         height = i[3] - i[1]
  42.         distance = abs(width - height) / 2
  43.         if width == height: continue
  44.         if width > height:
  45.             i[1] -= distance
  46.             i[3] += distance
  47.         else:
  48.             i[0] -= distance
  49.             i[2] += distance


  50. old_pic = Image.open("pic.jpg")
  51. new_pic = Image.new("RGB", old_pic.size)
  52. width, height = old_pic.size
  53. for y in range(height):
  54.     for x in range(width):
  55.         if not is_background(old_pic, y, x):
  56.             new_pic.putpixel((x, y), (255, 255, 255))
  57. new_pic.save("new_pic.png")

  58. exit(1)

  59. sys.setrecursionlimit(1000000)
  60. location = []
  61. pic = Image.open("pic.jpg")
  62. width, height = pic.size
  63. for y in range(height):
  64.     for x in range(width):
  65.         if not is_background(pic, y, x):
  66.             if not is_contain(location, y, x):
  67.                 location.append(find_block(y, x))

  68. format(location)
  69. for i in range(len(location)):
  70.     pic.crop(location[i]).save(str(i) + ".png")
复制代码


new_pic.png


上面的代码生成了这样一张图片,说明了什么问题?
说明 is_background 函数有问题
查看一下 pic.jpg 的背景色是 183cdb
所以 is_background 函数有什么问题呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-20 08:16:18 | 显示全部楼层

非常感谢,我找了很久,大约找到位置,看不明是怎样算了。主要还是不会。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-20 16:28:28 | 显示全部楼层

老大,你这个程序把要抠的删了,不是把图抠出来。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-20 19:58:01 | 显示全部楼层
wgij007 发表于 2022-9-20 16:28
老大,你这个程序把要抠的删了,不是把图抠出来。

所以为什么会这样呢?
是不是 is_background 函数的问题?
那就修改这个函数
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-20 22:02:40 | 显示全部楼层
人造人 发表于 2022-9-20 19:58
所以为什么会这样呢?
是不是 is_background 函数的问题?
那就修改这个函数

好的,谢谢,我试试
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-22 08:18:35 | 显示全部楼层

老大,能不能再帮一下,搞不了呀,新的程序 有几个DEF 没用了, 后面那段也是用一个跳过去了。。
new_pic.putpixel((x, y), (255, 255, 255))  这段不明怎样改
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-22 09:18:13 | 显示全部楼层
wgij007 发表于 2022-9-22 08:18
老大,能不能再帮一下,搞不了呀,新的程序 有几个DEF 没用了, 后面那段也是用一个跳过去了。。
new_pi ...

这一段程序是用来调试的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-22 22:31:04 | 显示全部楼层
人造人 发表于 2022-9-22 09:18
这一段程序是用来调试的

好的,再试试,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-26 16:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表