- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个圆形蒙版的图像,它基本上是黑色图像中的一个彩色圆圈。
我要删除蒙版周围的所有空白区域,以使图像的边界与圆圈对齐,如下所示:
我已经编写了一个脚本,通过搜索每一列和每一行直到出现一个值大于0的像素来做到这一点。从左到右,从右到左,从上到下以及从下到上搜索可以使我获得蒙版边界,从而可以裁剪原始图像。这是代码:
ROWS, COLS, _ = img.shape
BORDER_RIGHT = (0,0)
BORDER_LEFT = (0,0)
right_found = False
left_found = False
# find borders of blank space for removal.
# left and right border
print('Searching for Right and Left corners')
for col in tqdm(range(COLS), position=0, leave=True):
for row in range(ROWS):
if left_found and right_found:
break
# searching from left to right
if not left_found and N.sum(img[row][col]) > 0:
BORDER_LEFT = (row, col)
left_found = True
# searching from right to left
if not right_found and N.sum(img[row][-col]) > 0:
BORDER_RIGHT = (row, img.shape[1] + (-col))
right_found = True
BORDER_TOP = (0,0)
BORDER_BOTTOM = (0,0)
top_found = False
bottom_found = False
# top and bottom borders
print('Searching for Top and Bottom corners')
for row in tqdm(range(ROWS), position=0, leave=True):
for col in range(COLS):
if top_found and bottom_found:
break
# searching top to bottom
if not top_found and N.sum(img[row][col]) > 0:
BORDER_TOP = (row, col)
top_found = True
# searching bottom to top
if not bottom_found and N.sum(img[-row][col]) > 0:
BORDER_BOTTOM = (img.shape[0] + (-row), col)
bottom_found = True
# crop left and right borders
new_img = img[:,BORDER_LEFT[1]: BORDER_RIGHT[1] ,:]
# crop top and bottom borders
new_img = new_img[BORDER_TOP[0] : BORDER_BOTTOM[0],:,:]
我想知道是否有更有效的方法来做到这一点。对于较大的图像,这可能会非常耗时,尤其是在蒙版相对于原始图像形状相对较小的情况下。谢谢!
最佳答案
假设图像中只有该对象,则有两种方法可以执行此操作:
numpy.where
查找非零的所有位置,然后在numpy.min
产生的适当行和列位置上使用 numpy.max
和 numpy.where
为边界矩形。 cv2.findContours
设置阈值后,您可以首先找到对象的轮廓点。这应该产生一个单一的轮廓,因此一旦有了这些点,就将其放置在 cv2.boundingRect
中,以返回矩形的左上角以及其范围的宽度和高度。 cv2.findContours
的输出中,并将其通过
cv2.boundingRect
进行管道传输即可获得对象的矩形尺寸利益。
import skimage.io as io
import numpy as np
import cv2
img = io.imread('/image/dj1a8.png')
值得庆幸的是,Scikit图像具有一种直接从Internet读取图像的方法:
skimage.io.imread
。
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
im = img_gray > 40
我使用OpenCV的
cv2.cvtColor
将图像从彩色转换为灰度。之后,我对图像进行阈值处理,以便将高于40的任何强度设置为
True
,其他所有设置为
False
。我反复尝试选择的阈值40,直到我得到一个看起来像圆形的面具。看一下这张图片,我们得到:
numpy.where
,然后使用
numpy.min
和
numpy.max
找到适当的左上角和右下角并裁剪图像:
(r, c) = np.where(im == 1)
min_row, min_col = np.min(r), np.min(c)
max_row, max_col = np.max(r), np.max(c)
im_crop = img[min_row:max_row+1, min_col:max_col+1]
2D数组的
numpy.where
将返回行和列位置非零的元组。如果找到最小的行和列位置,则该位置对应于边界矩形的左上角。同样,最大的行和列的位置对应于边界矩形的右下角。好的是
numpy.min
和
numpy.max
以矢量化方式工作,这意味着它可以在一次扫描中对整个NumPy数组进行操作。上面使用了此逻辑,然后我们索引到原始彩色图像中,以裁剪出包含感兴趣对象的行和列的范围。
im_crop
包含该结果。请注意,当我们索引时,最大行和列需要加1,因为与末端索引的 slice 是互斥的,因此加1可以确保我们在矩形的右下角包括像素位置。
cv2.findContours
查找图像中所有对象的所有轮廓点。因为只有一个对象,所以只能得到一个轮廓,因此我们使用该轮廓将其插入
cv2.boundingRect
中,以找到对象边界矩形的左上角,并结合其宽度和高度来裁剪图像。
cnt, _ = cv2.findContours(im.astype(np.uint8), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
x, y, w, h = cv2.boundingRect(cnt[0])
im_crop = img[y:y+h, x:x+w]
请注意,我们必须将阈值图像转换为无符号的8位整数,因为这是函数期望的类型。此外,我们使用
cv2.RETR_EXTERNAL
,因为我们只想检索图像中看到的任何对象的外围坐标。我们还使用
cv2.CHAIN_APPROX_NONE
返回对象上所有可能的轮廓点。
cnt
是在图像中找到的轮廓列表。该列表的大小应仅为1,因此我们直接对其进行索引并将其通过管道传递到
cv2.boundingRect
中。然后,我们使用矩形的左上角,并结合其宽度和高度来裁剪出对象。
import skimage.io as io
import cv2
import numpy as np
img = io.imread('/image/dj1a8.png')
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
im = img_gray > 40
# Method #1
(r, c) = np.where(im == 1)
min_row, min_col = np.min(r), np.min(c)
max_row, max_col = np.max(r), np.max(c)
im_crop = img[min_row:max_row+1, min_col:max_col+1]
# Method #2
#cnt, _ = cv2.findContours(im.astype(np.uint8), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
#x, y, w, h = cv2.boundingRect(cnt[0])
#im_crop = img[y:y+h, x:x+w]
关于python - 去除圆形蒙版周围的空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62629743/
我想要一个“真正的”圆形 UIView,以避免应用圆角半径的正方形 View 。 因为我使用的是重力,我的圆圈不能很好地显示,因为它们在角落里不能相互接触(屏幕来自“Debug View Hierar
所以我前段时间建了一点突破克隆 ,我想稍微升级一下,主要是为了碰撞。当我第一次制作它时,我在我的球和我的砖 block 之间进行了基本的“碰撞”检测,这实际上将球视为另一个矩形。但这造成了边缘碰撞的问
我正在尝试在矩形内创建一个椭圆形/圆形。我正在尝试在 Canvas 上对位图图像执行此操作。这是我的代码: int x = (int) (midpoint.x*xRatio); int y = (in
我想知道是否可以绘制圆形 UIButton(不是圆形矩形)。 当我在自定义类型的 UIButton 中添加圆形图像时,它看起来像一个圆形按钮。但是在按钮被点击的那一刻,按钮的边界变得可见,所以它看起来
我有this slider在我的网站上。我想将 slider 移动到 360 度。我如何更改以下脚本来执行此操作? $(document).ready(function() { /*Slide
我正在 PyQt 中使用 QGraphicsView 构建一个 GUI,它将显示互连项目的大型网络,并且我希望能够叠加一个较小的门户来显示网络的远处部分 - 有点像“画中画” “之类的事情。这本身并不
我正在尝试为个人资料图片圈出 ImageView 。在我限制 UiScreen 宽度之前它工作正常。 代码如下 import UIKit class ViewController: UIViewCon
我想创建一个如下所示的圆形 slider 。 但我还想要两个功能。 1) 我想从任意点启动 slider ,但在图 1 中。从0开始。 2) 我想在单个圆形黑色图中包含多个 slider 。 我正在分
我有一个帖子 div,它位于一个奇怪的背景之上,正如您在此屏幕截图中所见 http://i.stack.imgur.com/L5Qj0.png文字越过我想要的区域。我尝试使用 border-radiu
我想知道,如何在 ios 8 或 9 中创建圆形模糊文本输入字段和模糊按钮。我应该使用核心动画还是简单地在 ps 中绘制 png?我从来没有为 UI 使用过 Core Animation,你能推荐一个
我希望在包含在主圆圈中的圆圈底部创建一个深色蒙版。 你可以使用 css masks 来做到这一点吗? 请参阅fiddle Change Profile
我有一个带有 ImageView 的自定义表格 View 单元格。我试图使 ImageView 成为圆形,但它不是圆形的,我无法查明问题所在。 import UIKit class Legislato
最近一直在opencv里瞎折腾,一直在摸索绘图函数(cvCircle(...), cvRectangle(...), etc...)。它们可以正常工作,但我只能在之前加载的图像上绘制它们。 有没有办法
我有一个 FXML 文件、一个 CSS 文件和一个 Controller.java 文件。当鼠标悬停在 FXML 文件中的按钮上时, 例如fx:id="负载" 如何在舞台上创建圆形节点? 我目前正在这
我对圆-矩形相交有疑问。虽然是一个数字我发现了关于它的讨论,我无法得到答案。我的问题是 - 我的 View /窗口 (320 X 480) 有一个矩形下部 (100-200,0-50) .And a
假设我们有以下一组项目 View : View1 -> View2 -> View3 -> ... -> View(n-1) -> View(n) 在经典的 RecyclerView 上,View1
我可以在“didTapAt”事件中在谷歌地图上添加许多标记和圆圈,但我也想删除它们,对于标记我可以在“didTap 标记”事件中执行此操作但我如何才能删除它的形状而不是其他形状? 最佳答案 let c
我正在尝试获得一个圆形的 UIImageView 但它似乎在不同的设备上呈现不同; 在 iPhone Xr 上看起来像这样: 在 iPhone 7 上看起来像这样: 我的高度限制为 60,代码如下:
我想做一个如下图所示的圆形 slider 。jQuery 能够做到这一点吗? 我知道直 slider 的工作原理,但我想制作一个 HTML5 圆形 slider 。这是我在网上找到的 http://j
我有一个包含图像的 UIScrollView。当用户到达最后一张图片并滑动手指查看下一张图片时,我想显示第一张图片。同样,当用户在第一张图片上滑动查看上一张图片时,我想显示最后一张图片。简而言之,这将
我是一名优秀的程序员,十分优秀!