渐变掩模

对于规则形状,比如圆形的渐变掩模生成是比较简单的,因为每一圈上像素的位置是固定的,只需要对每一圈上的像素填充上不同的值即可生成渐变的Mask,如图1所示为一个圆形的渐变Mask。
图1

但是这种Mask生成方式并不适用于不规则的形状,下面将描述一种生成不规则形状Mask的方法。

不规则渐变Mask的生成

如图2所示为一个不规则的圆环形状。如果希望图示的白色区域是一个渐变的显示,则可以图像中心为原点,作多条直线进行采样(图3),则可得到每条直线穿过的像素点坐标,继而实现径向的像素值的渐变。
图2
本示例的采样率为1degree,即每旋转1°采样一次,图3仅展示部分角度的采样直线。
图3

最终的渐变Mask如图4所示,沿着不规则环形的内侧边缘,每个径向有10步(10个像素)下降。

代码实现

定义

import os
import numpy as np
import math
from matplotlib import pyplot as plt
from scipy.interpolate import interp1d
import cv2sample_freq = 1 # deg
sample_steps = int(180/sample_freq)
coordinate_xAxis = np.reshape(np.arange(0,128),(1,128)) #1*128
coordinate_xAxis = np.repeat(coordinate_xAxis,128,axis=0) # 128*128
coordinate_xAxis = coordinate_xAxis-64+0.5
coordinate_yAxis = np.reshape(np.arange(127,-1,-1),(128,1)) #128*1
coordinate_yAxis = np.repeat(coordinate_yAxis,128,axis=1) # 128*128
coordinate_yAxis = coordinate_yAxis-64+0.5
angle = np.arctan(coordinate_yAxis/coordinate_xAxis)*180/math.pi # degree
angle[angle<0] +=180
pixel_index = []
line_index_1 = np.floor(angle/sample_freq)
line_index_2 = np.ceil(angle/sample_freq)

计算采样直线通过的像素坐标

for i in range(sample_steps):flag1 = np.argwhere(line_index_1==i)flag2 = np.argwhere(line_index_2==i)flag = np.concatenate((flag1,flag2),axis=0)z = np.ones((128,128))z[flag[:,0],flag[:,1]] = 100if i*sample_freq<=45 or i*sample_freq>=135:  for col in range(128):        try:if col<64:preserve_pixel_idx = np.argwhere(z[:,col]==100)[-1]else:preserve_pixel_idx = np.argwhere(z[:,col]==100)[0]except:continuez[preserve_pixel_idx[0],col] = 500if i*sample_freq>45 and i*sample_freq<135: for row in range(128):        try:if row<64:preserve_pixel_idx = np.argwhere(z[row,:]==100)[-1]else:preserve_pixel_idx = np.argwhere(z[row,:]==100)[0]except:continue z[row,preserve_pixel_idx[0]] = 500flag_z = np.argwhere(z==500)zz = np.ones((128,128))zz[flag_z[:,0],flag_z[:,1]] = 500# plt.imshow(zz)  if i*sample_freq>45 and i*sample_freq<135:  col_value = np.unique(flag_z[:,1])cnt=0for r in col_value:temp = np.argwhere(flag_z[:,1]==r)if cnt==0:flag_final = np.squeeze(flag_z[temp],axis=1)else:flag_final = np.concatenate((flag_final,np.squeeze(flag_z[temp],axis=1)),axis=0)cnt = cnt+1f = interp1d(flag_final[:,0],flag_final[:,1])y = np.expand_dims(f(np.arange(flag_final[:,0].min(),flag_final[:,0].max()+1)),axis=1) y = np.round(y)x = np.expand_dims(np.arange(flag_final[:,0].min(),flag_final[:,0].max()+1),axis=1)flag_final_ = np.concatenate((y,x),axis=1)zzz = np.ones((128,128))zzz[flag_final_[:,1].astype('int'),flag_final_[:,0].astype('int')] = 500if i*sample_freq<=45 or i*sample_freq>=135:  row_value = np.unique(flag_z[:,0])cnt=0for r in row_value:temp = np.argwhere(flag_z[:,0]==r)if cnt==0:flag_final = np.squeeze(flag_z[temp][::-1],axis=1)else:flag_final = np.concatenate((flag_final,np.squeeze(flag_z[temp][::-1],axis=1)),axis=0)cnt = cnt+1f = interp1d(flag_final[:,1],flag_final[:,0])y = np.expand_dims(f(np.arange(flag_final[:,1].min(),flag_final[:,1].max()+1)),axis=1) y = np.round(y)x = np.expand_dims(np.arange(flag_final[:,1].min(),flag_final[:,1].max()+1),axis=1)flag_final_ = np.concatenate((y,x),axis=1)zzz = np.ones((128,128))zzz[flag_final_[:,0].astype('int'),flag_final_[:,1].astype('int')] = 500plt.imshow(zzz) # 可以plot出图3的采样直线## 注意! angle<=45 or angle>=135的情况,pixel_index中存储的是[row_idx,col_idx];##  angle>45 and angle<135的情况,pixel_index中存储的是[col_idx,row_idx]pixel_index.append(flag_final_.astype('int')) # 所有采样直线通过的像素坐标

给径向像素赋值生成渐变图像

for root, dirs, files in os.walk(root_path):for name in files:ct = np.load('your image')sample_weight = np.ones((128,128))for i in range(sample_steps):value_line = []if i*sample_freq<=45 or i*sample_freq>=135:for m in pixel_index[i]:value_line.append(ct[m[0],m[1]]) if i*sample_freq>45 and i*sample_freq<135:for m in pixel_index[i]:value_line.append(ct[m[1],m[0]])            value_line = np.array(value_line)zeros_index_on_line = np.squeeze(np.argwhere(value_line==0))border_on_line = np.argwhere(np.diff(zeros_index_on_line)!=1)  # two pointsborder_on_line[0] = border_on_line[0]+1border_on_img = np.squeeze(pixel_index[i][zeros_index_on_line[border_on_line]]) # two pointsif border_on_img.size!=4:continue# show borderborder = np.ones((128,128))if i*sample_freq<=45 or i*sample_freq>=135:border[border_on_img[:,0],border_on_img[:,1]] = 500if i*sample_freq>45 and i*sample_freq<135:border[border_on_img[:,1],border_on_img[:,0]] = 500# plt.imshow(border)border_around_on_img = []border_around_on_line = border_on_line.copy()for v in range(10):border_around_on_line[0] = zeros_index_on_line[border_on_line][0]-(v+1)border_around_on_line[1] = zeros_index_on_line[border_on_line][1]+(v+1)tmp = np.squeeze(pixel_index[i][border_around_on_line])border_around_on_img.append(tmp)if i*sample_freq<=45 or i*sample_freq>=135:sample_weight[tmp[:,0],tmp[:,1]] = (10-v)*5if i*sample_freq>45 and i*sample_freq<135:sample_weight[tmp[:,1],tmp[:,0]] = (10-v)*5

讨论

这种不规则形状的渐变掩模应该也可以通过腐蚀膨胀操作来实现,但是腐蚀膨胀操作的系数不好控制,无法精确到单个像素。

不规则形状渐变掩模(gradient mask)的生成相关推荐

  1. 使用示例_使用 COMSOL 软件模拟不规则形状并构建几何模型示例

    本文是如何在 COMSOL Multiphysics® 软件中模拟不规则形状的系列文章的第二部分.今天我们重点介绍如何基于以各种格式存储的高程数据(例如文本.图像或 DEM 文件)创建不规则形状的表面 ...

  2. (六)Flutter 基础部件 TextView 和TextStyle Flutter 容器 装饰盒子 边框 圆角 阴影 形状 渐变 背景图像

    RichText:行内多样式的文字 import 'package:flutter/material.dart';class BasicDemo extends StatelessWidget {@o ...

  3. DBSCAN: 基于密度对空间含噪声数据中不规则形状进行聚类

    聚类算法是机器学习中使用频率较高的无监督学习方法,不需要样本标签,就可以将其进行分类,常常作为其他学习任务的前期粗加工.但是原始聚类算法在面对含有噪声或形状非凸的数据分布时表现较差,于是有研究人员提出 ...

  4. gprMax中任意不规则形状建模与模拟

    gprMax中任意不规则形状三维建模与模拟 gprMax中给出了不规则几何形状的建模方法.常规的几何建模都是基于gprMax内置的几何命令建模,所建立的模型是规则的,如圆球.正方体.圆柱体.三角体等. ...

  5. QT不规则形状的按钮的实现

    Qt实现按钮的不规则样式设置,不是视觉欺骗,是真正的不规则按钮,点击按钮外面不会触发按钮的点击信号 使用如下的代码可以实现特殊形状的按钮,但是按钮还是矩形的,如果按在不规则图形的外面,但是是按钮的矩形 ...

  6. pads pcb导出pdf文件_干货 | 学会设计不规则形状PCB,看这一篇就够了

    我们预想中的完整 PCB 通常都是规整的矩形形状.虽然大多数设计确实是矩形的,但是很多设计都需要不规则形状的电路板,而这类形状往往不太容易设计.本文介绍了如何设计不规则形状的 PCB. 如今,PCB ...

  7. html插入不规则表格,如何构建HTML表格中的不规则形状?

    我试图复制下面的表格中HTML: 但也有一些额外的,形状不规则行,我想知道如果有一个简单的方法使用表来编写他们,尤其是游泳学校上周五,以及星期一至星期四晚上的租金.如何构建HTML表格中的不规则形状? ...

  8. Quartz2D简单绘制之不规则形状

    // 画不规则形状CGContextRef contextRef = UIGraphicsGetCurrentContext();CGContextSetRGBStrokeColor(contextR ...

  9. [html] 制作一个不规则形状有哪些方法可以实现?

    [html] 制作一个不规则形状有哪些方法可以实现? canvas 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

最新文章

  1. 8. 修改matlab GUI中fig和m文件名修改流程及注意事项
  2. 大数据分析处理框架——离线分析(hive,pig,spark)、近似实时分析(Impala)和实时分析(storm、spark streaming)...
  3. 【渝粤题库】国家开放大学2021春1373特殊教育概论题目
  4. 前端学习(504):垂直居中的第一种方式
  5. Java 汉字转拼音 Scala 汉字转拼音
  6. 哈希表 Hashtable c# 1613537346
  7. FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧内宏块(Intra)
  8. MNIST二进制数据集探索--基于Numpy处理
  9. 数学之路(3)-机器学习(3)-机器学习算法-欧氏距离(3)
  10. Android Support兼容包详解
  11. python 云计算开发是什么_云计算是什么?云计算开发学习路线
  12. 计算机二级vf查询,计算机二级《VFP》知识点讲解:查询和视图
  13. 闪迪u盘量产工具万能版_加密保护,更高性能!闪迪酷奂CZ74 U盘新品果然够惊艳...
  14. FLUKE OTDR光纤测试仪OFP2-100-Q双光纤双向测试的方法
  15. 热敏打印机数据截取+追加打印二维码
  16. lol人物模型提取(七)
  17. 天梯赛L1(1-80)
  18. 欧洲专线运输方式有哪些?有哪些优势?
  19. (预处理合集)手写数据集MNIST(2)——Spyder
  20. echarts 点击方法总结,点任意一点获取点击数据,举例说明:在多图联动中点击绘制标线...

热门文章

  1. POJ 3422 Kaka's Matrix Travels | 费用流
  2. 如果同步块内的线程抛出异常会发生什么?
  3. Mac下github的基本使用(有详细过程)
  4. AI+安防,怎样引领安防行业的变革?
  5. python拼多多1分抢手机_如何抢到拼多多1元秒杀?抢不到是怎么回事?
  6. jQuery 验证码输入错误后自动刷新验证码 点击验证码图片刷新验证码
  7. springboot 问题记录
  8. Linux 权限系统
  9. https://www.52pojie.cn/thread-688820-1-1.html
  10. 我国最高山峰是珠穆朗玛峰:8848m,我现在有一张足够大的纸张,厚度为:0.01m。请问,我折叠多少次,就可 以保证厚度不低于珠穆朗玛峰的高度?