我正在尝试使用 cv2 模块从定义的 RGB 范围内的图像中提取特定颜色。在下面的示例中,我试图将火焰与黄色和白色 RGB 值之间的航天飞机排气隔离,然后打印出该范围内与图像其余部分相比的 RGB 值百分比。
这是我的最小工作示例:
import cv2
import numpy as np
from matplotlib import pyplot as plt
import imageio
img = imageio.imread(r"shuttle.jpg")
plt.imshow(img)
Run Code Online (Sandbox Code Playgroud)
这是输出图像。它来自维基百科。
img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
color1 = (255,255,0) #yellow
color2 = (255,255,255) #white
boundaries = [([color1[0], color1[1], color1[2]], [color2[0], color2[1], color2[2]])]
for (lower, upper) in boundaries:
lower = np.array(lower, dtype=np.uint8)
upper = np.array(upper, dtype=np.uint8)
mask = cv2.inRange(img, lower, upper)
output = cv2.bitwise_and(img, img, mask=mask)
ratio = cv2.countNonZero(mask)/(img.size/3)
print('pixel percentage:', np.round(ratio*100, 2)) …Run Code Online (Sandbox Code Playgroud) 我试图调试我的 python tkinter 应用程序,但我注意到我的调试器在到达 tkinter 的 mainloop() 方法时停止工作。
尽管我的应用程序按预期工作,但与它交互似乎没有更新我的调试器或变量值。经过搜索后,我发现有关该主题的信息非常少,并且由于核心库是用 C 编写的,因此无法在主循环中调试 tkinter 应用程序。
当然必须有一些解决方法吗?
目前,我发现自己必须手动调试 tkinter 应用程序上的每一个交互,随着我的应用程序变得复杂,这非常耗时且效率低下。
由于某些原因,plt.autoscale似乎不适用于很小的值(例如1E-05)。如图所示,所有内容都显示在靠近零轴的位置。
有什么想法我在这里出错吗?
import matplotlib.pyplot as plt
y= [1.09E-05, 1.63E-05, 2.45E-05, 3.59E-05, 5.09E-05, 6.93E-05, 9.07E-05]
x= [0, 10, 20, 30, 40, 50, 60]
fig3, ax3 = plt.subplots()
ax3.scatter(x, y, color='k', marker = "o")
ax3 = plt.gca()
plt.autoscale(enable=True, axis="y", tight=False)
plt.show()
Run Code Online (Sandbox Code Playgroud)
如果我有两个小列表并且我想找到list1中的每个列表与list2 中的每个列表之间的相关性,我可以这样做
from scipy.stats import pearsonr
list1 = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
list2 = [[10,20,30],[40,50,60],[77,78,79],[80,78,56]]
corrVal = []
for i in list1:
for j in list2:
corrVal.append(pearsonr(i,j)[0])
print(corrVal)
OUTPUT: [1.0, 1.0, 1.0, -0.90112711377916588, 1.0, 1.0, 1.0, -0.90112711377916588, 1.0, 1.0, 1.0, -0.90112711377916588, 1.0, 1.0, 1.0, -0.90112711377916588]
Run Code Online (Sandbox Code Playgroud)
效果很好……差不多。(编辑:刚刚注意到我上面的相关输出似乎给出了正确的答案,但它们重复了 4 次。不确定为什么这样做)
但是,对于列表中包含 1000 个值的较大数据集,我的代码无限期冻结,不输出任何错误,因此我每次都强制退出我的 IDE。我在这里滑倒的任何想法?不确定 pearsonr 函数可以处理的数量是否存在固有限制,或者我的编码是否导致了问题。
我有一些数据绘制,我强制科学记数法的权力为10(而不是指数).下面是一段代码:
import matplotlib.ticker as mticker
formatter = mticker.ScalarFormatter(useMathText=True)
formatter.set_powerlimits((-3,2))
ax.yaxis.set_major_formatter(formatter)
Run Code Online (Sandbox Code Playgroud)
但是,x10 ^ -4的比例因子出现在图的左上角.
是否有一种简单的方法可以强制将此比例因子的位置放在y标签旁边,如下图所示?
我在这里有一个大的嵌套列表,这是简化的,因为实际的列表有几十个列表:
bigNestedList = [["d", "c", "a", "b", "e"],[4,"",8,9,""],.....]
Run Code Online (Sandbox Code Playgroud)
为简单起见,我将它们分成两个单独的列表:
list1 = ["d", "c", "a", "b", "e"]
list2 = [4,"",8,9,""]
Run Code Online (Sandbox Code Playgroud)
我想按升序对list2排序list1.但是问题出现在list2中的空格.
我试图删除list2中的空格并对它们进行排序:
list2_tmp = list(filter(None, list2))
list2, list1 = zip(*sorted(zip(list2_tmp, list1)))
Run Code Online (Sandbox Code Playgroud)
但是最终的排序列表不正确
list1
Out[164]: ('d', 'c', 'a')
list2
Out[165]: (4, 8, 9)
Run Code Online (Sandbox Code Playgroud)
正确的答案应该是(d,a,b)和(4,8,9).
但这意味着我必须删除list1中与list2中空白索引相对应的元素.但是我必须在我的代码中使用list1中的原始数据.
因此,如何通过忽略任何空白而不是创建耗尽更多内存的额外列表,以最有效的方式对这两个列表进行排序?(我有几十个列表,以便稍后将其分类为list1)
我有两个以浮点格式存储的时间戳:
tms1 = 1479081600.0
tms2 = 1482105600.0
Run Code Online (Sandbox Code Playgroud)
计算差异后我得到
tms2 - tms1
3024000.0
Run Code Online (Sandbox Code Playgroud)
如何将 3024000 的时差显示为可读格式(以天、月或年为单位)?(使用在线unix时差计算器,答案是2016年11月14日至2016年12月19日之间的35天)
python ×6
python-3.x ×3
matplotlib ×2
algorithm ×1
correlation ×1
cv2 ×1
datetime ×1
opencv ×1
scipy ×1
tkinter ×1