我试图通过stat_contour()我的ggplot/ ggplot2-plot 添加轮廓线.不幸的是,我无法提供应该评估点值的真实数据.但是,另一个易于复制的示例表现相同:
testPts <- data.frame(x=rep(seq(7.08, 7.14, by=0.005), 200))
testPts$y <- runif(length(testPts$x), 50.93, 50.96)
testPts$z <- sin(testPts$y * 500)
ggplot(data=testPts, aes(x=x, y=y, z=z)) + geom_point(aes(colour=z))
+ stat_contour()
Run Code Online (Sandbox Code Playgroud)
这会导致以下错误消息:
if(nrow(layer_data)== 0)return()中的错误:参数长度为零另外:警告消息:无法生成轮廓数据
该示例与stackoverflow或官方手册/教程中发布的其他示例没有什么不同,如果我提供更多规范,seeminlgy无关紧要stat_contour.看来,该函数不会像错误消息所指示的那样传递数据(-layer).
感谢您的想法和建议!
我正在寻找完全填充ggplot2的stat_contour生成的轮廓的方法.目前的结果是这样的:
# Generate data
library(ggplot2)
library(reshape2) # for melt
volcano3d <- melt(volcano)
names(volcano3d) <- c("x", "y", "z")
v <- ggplot(volcano3d, aes(x, y, z = z))
v + stat_contour(geom="polygon", aes(fill=..level..))
Run Code Online (Sandbox Code Playgroud)

可以通过如下手动修改代码来产生期望的结果.
v + stat_contour(geom="polygon", aes(fill=..level..)) +
theme(panel.grid=element_blank())+ # delete grid lines
scale_x_continuous(limits=c(min(volcano3d$x),max(volcano3d$x)), expand=c(0,0))+ # set x limits
scale_y_continuous(limits=c(min(volcano3d$y),max(volcano3d$y)), expand=c(0,0))+ # set y limits
theme(panel.background=element_rect(fill="#132B43")) # color background
Run Code Online (Sandbox Code Playgroud)

我的问题:有没有办法完全填充绘图而无需手动指定颜色或使用geom_tile()?
我想知道比较一组轮廓的最佳策略是什么,实际上是从两张图片中检测到精确边缘的边缘,以便知道哪一对更相似.
我有这个图像:
http://i55.tinypic.com/10fe1y8.jpg
我想知道如何计算出哪一种最适合它:
http://i56.tinypic.com/zmxd13.jpg
(它应该是右边的那个)
无论如何比较整个轮廓?我可以轻松旋转图像,但我不知道使用什么函数来计算右边的参考图像是最合适的.
这是我已经尝试过使用opencv的内容:
matchShapes函数 - 我使用2个灰度图像尝试了这个函数,我总是在每个比较图像中得到相同的结果,并且值似乎是错误的,因为它是0,0002.
所以我对matchShapes有所了解,但我不确定这是正确的假设,是该函数适用于成对的轮廓而不是完整的图像.现在这是一个问题,因为虽然我有想要比较的图像的轮廓,但它们是数百个,我不知道哪些应该"配对".
所以我也尝试将第一个图像的所有轮廓与其他两个轮廓进行迭代比较,但我可能会比较,例如,5的轮廓与两个参考图像的圆形轮廓而不是2个轮廓.
还试过简单的cv :: compare函数和matchTemplate,没有成功.
如何使用python中的countour网格matplotlib.pyplot,其中网格是一种颜色,其中z变量低于零,另一种颜色z等于或大于零?我不是很熟悉,matplotlib如果有人能给我一个简单的方法,那就太好了.
到目前为止,我有:
x= np.arange(0,361)
y= np.arange(0,91)
X,Y = np.meshgrid(x,y)
area = funcarea(L,D,H,W,X,Y) #L,D,H and W are all constants defined elsewhere.
plt.figure()
plt.contourf(X,Y,area)
plt.show()
Run Code Online (Sandbox Code Playgroud) 我有一个数据集如下(在Python中):
import numpy as np
A = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0, 0.1, 0.2, 0.3, 0.4, 0.2, 0.2, 0.05, 0.1])
B = np.array([0.9, 0.7, 0.5, 0.3, 0.1, 0.2, 0.1, 0.15, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
C = np.array([0, 0.1, 0.2, 0.3, 0.4, 0.2, 0.2, 0.05, 0.1, 0.9, 0.7, 0.5, 0.3, 0.1, 0.2, 0.1, 0.15, 0])
D = np.array([1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, …Run Code Online (Sandbox Code Playgroud) 我正在尝试检测扑克牌并使用 python opencv 将它们转换为鸟瞰卡片。我的代码适用于简单的情况,但我并没有停留在简单的情况下,而是想尝试更复杂的情况。我在为卡片找到正确的轮廓时遇到问题。这是我试图检测卡片并绘制轮廓的附加图像:
我的代码:
path1 = "F:\\ComputerVisionPrograms\\images\\cards4.jpeg"
g = cv2.imread(path1,0)
img = cv2.imread(path1)
edge = cv2.Canny(g,50,200)
p,c,h = cv2.findContours(edge, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
rect = []
for i in c:
p = cv2.arcLength(i, True)
ap = cv2.approxPolyDP(i, 0.02 * p, True)
if len(ap)==4:
rect.append(i)
cv2.drawContours(img,rect, -1, (0, 255, 0), 3)
plt.imshow(img)
plt.show()
Run Code Online (Sandbox Code Playgroud)
结果:
这不是我想要的,我只想选择矩形卡片,但由于它们相互遮挡,我没有得到我所期望的。我相信我需要应用形态学技巧或其他操作来将它们分开或使边缘更加突出或可能是其他东西。如果您能分享您解决此问题的方法,将不胜感激。
其他研究员要求的更多示例:
我有两个变量的函数f(x,y),其中我需要知道它与零交叉的曲线的位置.ContourPlot非常有效地做到了这一点(即:它使用巧妙的多网格方法,而不仅仅是一个强力细粒度扫描),但只是给了我一个情节.我想有一组值{x,y}(具有一些指定的分辨率)或者可能有一些插值函数,它允许我访问这些轮廓的位置.
想过从ContourPlot的FullForm中提取这个,但这似乎有点像黑客.有更好的方法吗?
在上一个问题中,我用ggplot2代替了(使用字段包)生成的等高线图(下面的完整示例).唯一的麻烦是,我想复制轮廓标签的位置,contour()默认情况下是在线的"最平坦"部分 - 第二张图片可能会显示原因.我对如何设置计算感到困惑.我在这里看到可以抓取用于生成轮廓线的数据,然后geom_text()可以用来绘制文本.那么剩下的就是弄清楚如何计算"最平坦"的部分.想法?
library(fields)
library(ggplot2)
library(reshape)
library(directlabels)
sumframe<-structure(list(Morph = c("LW", "LW", "LW", "LW", "LW", "LW", "LW", "LW", "LW", "LW", "LW", "LW", "LW", "SW", "SW", "SW", "SW", "SW", "SW", "SW", "SW", "SW", "SW", "SW", "SW", "SW"), xvalue = c(4, 8, 9, 9.75, 13, 14, 16.25, 17.25, 18, 23, 27, 28, 28.75, 4, 8, 9, 9.75, 13, 14, 16.25, 17.25, 18, 23, 27, 28, 28.75), yvalue = c(17, 34, 12, 21.75, 29, 7, 36.25, …Run Code Online (Sandbox Code Playgroud) 我试图使用提取图像中轮廓的近似值cv2.approxPolyDP().这是我正在使用的图像:
我的代码试图隔离主岛并定义和绘制轮廓近似和轮廓外壳.我绘制了以绿色找到的轮廓,近似为红色:
import numpy as np
import cv2
# load image and shrink - it's massive
img = cv2.imread('../data/UK.png')
img = cv2.resize(img, None,fx=0.25, fy=0.25, interpolation = cv2.INTER_CUBIC)
# get a blank canvas for drawing contour on and convert img to grayscale
canvas = np.zeros(img.shape, np.uint8)
img2gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# filter out small lines between counties
kernel = np.ones((5,5),np.float32)/25
img2gray = cv2.filter2D(img2gray,-1,kernel)
# threshold the image and extract contours
ret,thresh = cv2.threshold(img2gray,250,255,cv2.THRESH_BINARY_INV)
im2,contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# find …Run Code Online (Sandbox Code Playgroud)