共计 2966 个字符,预计需要花费 8 分钟才能阅读完成。
提醒:本文最后更新于 2024-08-27 10:42,文中所关联的信息可能已发生改变,请知悉!
去除毛刺的实验
样例图片:
存在问题
一番实验过后发现效果不行
算法细节(补充)
根据讨论纪要中的算法,制定了两项的测试方案:
- 对全图取 2X2 的像素矩阵为一个单位,根据人为确定的阈值(如 10 与 10 附近的一些值),来确定划分边,结果发现被标记为一次划分的边不一定与毛刺有关联
- 为了提高实验效率,随机抽取多组肉眼可见的带有毛刺的局部样例,利用讨论纪要中的划分方式(将分割边连在一起,划分出两个部分,噪声被划分在哪一个部分就用该部分最接近与噪声值的像素值进行赋值)进行划分测试
分析原因
利用脚本将图片绘制到 execl 表格
代码示例
# -*- coding: utf-8 -*-
from PIL import Image
import openpyxl
import openpyxl.styles
from openpyxl.styles import PatternFill
from openpyxl.utils import get_column_letter
from progressbar import *
def RGB_to_Hex(rgb):
"""
RGB 颜色转换成 16 进制颜色
:param rgb:
:return:
"""
RGB = rgb.split(',') # 将 RGB 格式划分开来
color = ''
for i in RGB:
num = int(i)
# 将 R、G、B 分别转化为 16 进制拼接转换并大写 hex() 函数用于将 10 进制整数转换成 16 进制,以字符串形式表示
color += str(hex(num))[-2:].replace('x', '0').upper()
return color
def img2excel(img_path,excelout_path):
"""
图片转换成 excel
:param img_path: 图片地址
:param excelout_path: excel 保存地址
:return:
"""
img_src = Image.open(img_path)
#宽高
img_width = img_src.size[0]
img_height=img_src.size[1]
print(" 图片宽 %s, 高 %s"%(img_width,img_height))
# 类型
# print(img_src.mode)
if img_src.mode != "RGB":
img_src = img_src.convert('RGB')
str_strlist = img_src.load()
wb=openpyxl.Workbook()
wb.save(excelout_path)
wb=openpyxl.load_workbook(excelout_path)
sheet=wb["Sheet"]
sheet.title="img2excel"
cell_width = 1.0
cell_height = cell_width * (2.2862 / 0.3612)
print(" 正在疯狂生成 excel, 请耐心等待...")
#进度条
widgets=[' 进度:',Percentage(),'',Bar('#'),'',Timer(),' ', ETA(), ' ']
pb=ProgressBar(widgets=widgets)
for w in pb(range(img_width)):
for h in range(img_height):
data = str_strlist[w,h]
# 把元组 rgb 颜色变成字符串,转换成 16 进制颜色(1,2,3)-->'1,2,3'
color=str(data).replace("(","").replace(")","")
#16 进制的颜色, 不带前面 #号的,要# 自己拼接到 color 前面即可
color=RGB_to_Hex(color)
# 设置填充颜色为 color,solid 参数表示填充实色
fille=PatternFill("solid",fgColor=color)
sheet.cell(h+1,w+1).fill=fille
print(" 生成完成, 正在设置单元格格式...")
for i in range(1, sheet.max_row+1):
sheet.row_dimensions[i].height=cell_height
for i in range(1, sheet.max_column+1):
sheet.column_dimensions[get_column_letter(i)].width = cell_width
print(' 格式设置完成, 正在保存 excel...')
wb.save(excelout_path)
img_src.close()
print(" 保存 excel 成功!请打开 [%s] 查看 "%excelout_path)
if __name__=='__main__':
import sys,os
if len(sys.argv)!=3:
print(" 请输入图片地址和 excel 保存的地址 \n"
" 例如命令行输入 python img2excel_user.py D:/result.png D:/outExcel.xlsx")
sys.exit(0)
else:
img_virify=['.jpg','.png','.gif','.bmp','.jpeg','.jpe','.jfif']
excel_virify=['.xlsx','.xlsm','.xltx','.xltm']
# 图片地址
img_path=sys.argv[1]
# excel 保存地址
excelout_path=sys.argv[2]
endName=os.path.splitext(img_path)
if endName[1] not in img_virify:
print(" 请选择支持的图片类型 ",img_virify)
sys.exit(0)
endName_excel=os.path.splitext(excelout_path)
if endName_excel[1] not in excel_virify:
print("excel 格式不支持,请选择支持的格式 ",excel_virify)
sys.exit(0)
img2excel(r""+img_path+"",excelout_path)
局部样例
举例:
方框选中区域为明显的毛刺区域,这也是比较典型的毛刺种类之一
B 通道数据示例
对于数据的划分如下图:
很明显经过分割以后,这样的状态仍然不能解决毛刺问题,反而还会让毛刺问题更加严重
而在讨论纪要中提到的求最短路划分的方法不能满足所有情况,理由如下:
-
如下图是不能用划分来去除毛刺的,被改变的划分不一定是合理的
-
有的会被判断为毛刺的地方可能就是图片本身所需要的(原图就应该是如此),如下图蓝色部分应该是越“尖”越好
正文完