Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么';从图像中裁剪圆形缩略图最简单的方法是什么?_Python_Image_Opencv_Image Processing_Crop - Fatal编程技术网

Python 什么';从图像中裁剪圆形缩略图最简单的方法是什么?

Python 什么';从图像中裁剪圆形缩略图最简单的方法是什么?,python,image,opencv,image-processing,crop,Python,Image,Opencv,Image Processing,Crop,我正在尝试从该图像裁剪一个居中(或不居中)的圆: 我从有关堆栈溢出主题的现有问题中盗取了这段代码,但出现了一些问题: import cv2 file = 'dog.png' img = cv2.imread(file) img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) circle = cv2.HoughCircles(img, 3, dp=1.5,

我正在尝试从该图像裁剪一个居中(或不居中)的圆:

我从有关堆栈溢出主题的现有问题中盗取了这段代码,但出现了一些问题:

import cv2

file = 'dog.png'

img = cv2.imread(file)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
circle = cv2.HoughCircles(img,
                          3,
                          dp=1.5,
                          minDist=10,
                          minRadius=1,
                          maxRadius=10)
x = circle[0][0][0]
y = circle[0][0][1]
r = circle[0][0][2]

rectX = (x - r) 
rectY = (y - r)
crop_img = img[rectY:(rectY+2*r), rectX:(rectX+2*r)]
cv2.imwrite('dog_circle.png', crop_img)
输出:

Traceback (most recent call last):
  File "C:\Users\Artur\Desktop\crop_circle - Kopie\crop_circle.py", line 14, in <module>
    x = circle[0][0][0]
TypeError: 'NoneType' object is not subscriptable
回溯(最近一次呼叫最后一次):
文件“C:\Users\Artur\Desktop\crop\u circle-Kopie\crop\u circle.py”,第14行,在
x=圆[0][0][0]
TypeError:“非类型”对象不可下标

cv2.HoughCircles()
似乎生成了
None
而不是裁剪的圆形数组。如何修复此问题?

此答案说明了如何应用遮罩。首先,读入图片:

import cv2
import numpy as np
img = cv2.imread('dog.jpg')
接下来,创建与源图像大小相同的遮罩或空白图像:

h,w,_ = img.shape
mask = np.zeros((h,w), np.uint8)
img = cv2.bitwise_and(img, img, mask= mask)
然后,在面具上画一个圆圈。根据面的位置更改这些参数:

cv2.circle(mask, (678,321), 5, 255, 654)
最后,遮罩源图像:

h,w,_ = img.shape
mask = np.zeros((h,w), np.uint8)
img = cv2.bitwise_and(img, img, mask= mask)
这是面具:

以及输出:


首先:
HoughCircles
用于检测图像上的圆,而不是裁剪图像


不能有圆形图像。图像始终为矩形,但某些像素可以是透明的(RGBA中的alpha通道),程序不会显示它们

所以,您可以先裁剪图像,使其具有方形,然后添加alpha通道,其中包含哪些像素应该可见的信息。在这里,你可以使用黑色背景上带白色圆圈的遮罩。最后,您必须将其保存为
png
tiff
,因为
jpg
无法保留alpha通道


为此,我使用模块
PIL
/
枕头

我裁剪图像中心的正方形区域,但你们可以使用不同的坐标

接下来,我创建具有相同大小和黑色背景的灰度图像,并绘制白色圆圈/椭圆

最后,我将此图像作为alpha通道添加到裁剪后的图像中,并将其另存为
png

from PIL import Image, ImageDraw

filename = 'dog.jpg'

# load image
img = Image.open(filename)

# crop image 
width, height = img.size
x = (width - height)//2
img_cropped = img.crop((x, 0, x+height, height))

# create grayscale image with white circle (255) on black background (0)
mask = Image.new('L', img_cropped.size)
mask_draw = ImageDraw.Draw(mask)
width, height = img_cropped.size
mask_draw.ellipse((0, 0, width, height), fill=255)
#mask.show()

# add mask as alpha channel
img_cropped.putalpha(mask)

# save as png which keeps alpha channel 
img_cropped.save('dog_circle.png')

img_cropped.show()
结果


顺便说一句:

在蒙版中,您可以使用0到255之间的值,不同的像素可能具有不同的透明度-其中一些像素可以是半透明的,以使边界平滑

若你们想在自己的页面上的HTML中使用它,那个么你们就不必创建圆形图像,因为web浏览器可以将图像的角画成圆形并显示为圆形。为此,您必须使用CSS


编辑:遮罩上有更多圆圈的示例


其想法是创建一个黑色遮罩,然后使用
cv2.circle()
绘制所需区域以白色裁剪出来。从那里,我们可以对原始图像和遮罩使用
cv2.bitwise_和()。为了裁剪结果,我们可以在掩模上使用
cv2.boundingRect()
来获得ROI,然后使用Numpy切片来提取结果。在本例中,我使用了从图像的宽度和高度导出的中心点

import cv2
import numpy as np

# Create mask and draw circle onto mask
image = cv2.imread('1.jpg')
mask = np.zeros(image.shape, dtype=np.uint8)
x,y = image.shape[1], image.shape[0]
cv2.circle(mask, (x//2,y//2), 300, (255,255,255), -1)

# Bitwise-and for ROI
ROI = cv2.bitwise_and(image, mask)

# Crop mask and turn background white
mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
x,y,w,h = cv2.boundingRect(mask)
result = ROI[y:y+h,x:x+w]
mask = mask[y:y+h,x:x+w]
result[mask==0] = (255,255,255)

cv2.imshow('result', result)
cv2.waitKey()


如何裁剪遮罩?
HoughCircles
用于检测图像上的圆,而不是裁剪。不能使用圆图像。图像始终为矩形,但某些像素可以是透明的(RGBA中的alpha通道),系统不会显示它。所以你们可以裁剪矩形并添加alpha通道,其中包含了哪些像素应该是可见的信息——在这里你们可以使用带圆圈的掩模。您必须另存为png或tiff,因为jpg无法保留alpha通道。。。可能重复的