Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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 如何使用OpenCV在一幅RGB图像中编码灰度、SobelX和SobelY?_Python_Numpy_Opencv_Cv2 - Fatal编程技术网

Python 如何使用OpenCV在一幅RGB图像中编码灰度、SobelX和SobelY?

Python 如何使用OpenCV在一幅RGB图像中编码灰度、SobelX和SobelY?,python,numpy,opencv,cv2,Python,Numpy,Opencv,Cv2,我有一个RGB图像。我想将其保存为一个新图像,其中,将保存在一个新图像的R、G和B通道中。如何在OpenCV中做这样的事情 换句话说,假设我们有RBG图像,我们想要创建一个新的RGB(或BGR不重要)图像,该图像将包含在其通道中的灰度值(在B中)、sobelX(在R中)和sobelY(在G中)。主要问题是我们需要以某种方式将Sobel量化\标准化为0-256个值。。。怎么做这样的事 多亏了@rabbi79,结果是: %matplotlib inline from matplotlib impor

我有一个RGB图像。我想将其保存为一个新图像,其中,将保存在一个新图像的R、G和B通道中。如何在OpenCV中做这样的事情

换句话说,假设我们有RBG
图像
,我们想要创建一个新的RGB(或BGR不重要)图像,该图像将包含在其通道中的灰度值(在B中)、sobelX(在R中)和sobelY(在G中)。主要问题是我们需要以某种方式将Sobel量化\标准化为0-256个值。。。怎么做这样的事

多亏了@rabbi79,结果是:

%matplotlib inline
from matplotlib import pyplot as plt
import cv2
import numpy as np
!wget "https://helpx.adobe.com/content/dam/help/en/stock/how-to/visual-reverse-image-search/jcr_content/main-pars/image/visual-reverse-image-search-v2_intro.jpg" -O dt.jpg

src = cv2.imread('./dt.jpg', cv2.IMREAD_GRAYSCALE)
def show(im):
  plt.imshow(im)
  plt.show()

show(src)
sobelx = cv2.Sobel(src, cv2.CV_64F, 1, 0)
sobely = cv2.Sobel(src, cv2.CV_64F, 0, 1)

abs_grad_x = cv2.convertScaleAbs(sobelx)
abs_grad_y = cv2.convertScaleAbs(sobely)
grad = cv2.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0)
show(grad)
b = cv2.GaussianBlur(src,(3,3),0)
laplacian = cv2.Laplacian(b,cv2.CV_64F)
l_dst = cv2.convertScaleAbs( laplacian  );
show(l_dst)
dest = np.dstack([src, l_dst, grad]).astype(np.uint8)
show(dest)

将图像加载为灰度图像(
IMREAD\u GRAYSCALE
):

gray=cv2.imread(图像名称,cv2.imread\u灰度)
分别创建sobel-X和sobel-Y

sobelx=cv2.convertScaleAbs((cv2.Sobel(灰色,cv2.CV_64F,1,0)))
sobely=cv2.convertScaleAbs((cv2.Sobel(灰色,cv2.CV_64F,0,1)))
创建具有源图像大小的空numpy数组,并将灰度、sobel-X和sobel-Y指定给目标图像的通道:

dest=np.empty((gray.shape[0],gray.shape[1],3),np.uint8)
dest[:,:,0]=灰色
dest[:,:,1]=sobelx
dest[:,:,2]=sobely
或图像:

dest=cv2.merge((灰色、sobelx、sobely))
分别使用:

dest=np.dstack([gray,sobelx,sobely]).astype(np.uint8)

总而言之:

gray=cv2.imread(图像名称,cv2.imread\u灰度)
sobelx=cv2.convertScaleAbs((cv2.Sobel(灰色,cv2.CV_64F,1,0)))
sobely=cv2.convertScaleAbs((cv2.Sobel(灰色,cv2.CV_64F,0,1)))
dest=np.dstack([gray,sobelx,sobely]).astype(np.uint8)

您是否知道如何形成这三个结果,并且只想知道如何组合这三个结果?在制作索贝尔图像时,您计划使用哪个频道?我可以问你为什么要这样做,以及你打算对结果做什么吗?你可以使用@MarkSetchell,我想它看起来会很奇怪!也许这只是为了保存图像,但即使这是一个错误,并没有达到OP的目的,这将是有趣的,甚至可能是有洞察力的。@Bicker我喜欢你的积极方法,因为你没有给予足够的关注。现在修好了。