np.zeros和np.ones创建出的图像是不是bgr顺序不一样
时间: 2023-08-03 11:19:41 浏览: 45
是的,np.zeros和np.ones创建出的图像默认的颜色顺序为BGR,而不是常见的RGB顺序。这是因为在OpenCV中,图像的通道顺序是BGR,而不是RGB。如果要使用RGB顺序创建图像,可以使用以下代码:
```
import numpy as np
import cv2
img = np.zeros((300, 300, 3), np.uint8)
img[:, :, 2] = 255 # R通道为255
img[:, :, 1] = 255 # G通道为255
img[:, :, 0] = 0 # B通道为0
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
这样,得到的img数组将是一个红色的图像,因为红色通道的值为255,而绿色和蓝色通道的值都为0。
相关问题
myimage = cv.cvtColor(img, cv.COLOR_BGR2GRAY) ret, img1 = cv.threshold(myimage, 100, 255, cv.THRESH_BINARY_INV) # cv.namedWindow('img1',0) # cv.resizeWindow('img1',600,600) # cv.imshow('img1',img1) # print(type(img1)) # print(img1.shape) # print(img1.size) # cv.waitKey(2) kernel1 = np.ones((10, 10), np.uint8) # 做一次膨胀 img2 = cv.dilate(img1, kernel1) # cv.namedWindow('img2', 0) # cv.resizeWindow('img2', 600, 600) # cv.imshow('img2', img2) contours, hierarchy = cv.findContours(img2, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE) # print(len(contours),hierarchy) for i in range(len(contours)): area = cv.contourArea(contours[i]) if area < 150: # '设定连通域最小阈值,小于该值被清理' cv.drawContours(img2, [contours[i]], 0, 0, -1) # import pdb;pdb.set_trace() # cv.imwrite('yuchuli.jpg', img2) ###########预处理 # import pdb;pdb.set_trace() not_row = img2[[not np.all(img2[i] == 0) for i in range(img2.shape[0])], :] bot_col = not_row[:, [not np.all(not_row[:, i] == 0) for i in range(not_row.shape[1])]] # import pdb;pdb.set_trace() # print(bot_col.shape) if bot_col.shape[0] > bot_col.shape[1]: if bot_col.shape[1] % 2 == 0: img_new = np.concatenate((np.zeros([bot_col.shape[0], int((bot_col.shape[0] - bot_col.shape[1]) / 2)]), bot_col, np.zeros([bot_col.shape[0], int((bot_col.shape[0] - bot_col.shape[1]) / 2)])), 1) if bot_col.shape[1] % 2 == 1: img_new = np.concatenate((np.zeros( [bot_col.shape[0], int((bot_col.shape[0] - bot_col.shape[1] - 1) / 2)]), bot_col, np.zeros( [bot_col.shape[0], int((bot_col.shape[0] - bot_col.shape[1] + 1) / 2)])), 1) cv.imwrite('fenge.jpg', img_new) ###########分割 file_path = 'fenge.jpg' return file_path这个具体以何种方法进行分割的
这段代码使用了 OpenCV 库中的图像处理函数实现了字符图片的分割。下面是代码的具体实现细节:
首先,将彩色图像转换为灰度图像,并使用二值化方法将图像转换为黑白图像。
```python
myimage = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, img1 = cv.threshold(myimage, 100, 255, cv.THRESH_BINARY_INV)
```
接着,使用膨胀操作将字符区域扩大。
```python
kernel1 = np.ones((10, 10), np.uint8) # 做一次膨胀
img2 = cv.dilate(img1, kernel1)
```
然后,使用 `findContours` 函数寻找图像中的轮廓,并根据轮廓的面积进行过滤,去除面积过小的连通域。
```python
contours, hierarchy = cv.findContours(img2, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
for i in range(len(contours)):
area = cv.contourArea(contours[i])
if area < 150:
cv.drawContours(img2, [contours[i]], 0, 0, -1)
```
接下来,根据字符区域的位置,将字符图片进行裁剪,得到多个字符图片。
```python
not_row = img2[[not np.all(img2[i] == 0) for i in range(img2.shape[0])], :]
bot_col = not_row[:, [not np.all(not_row[:, i] == 0) for i in range(not_row.shape[1])]]
if bot_col.shape[0] > bot_col.shape[1]:
if bot_col.shape[1] % 2 == 0:
img_new = np.concatenate((np.zeros([bot_col.shape[0], int((bot_col.shape[0] - bot_col.shape[1]) / 2)]),
bot_col,
np.zeros([bot_col.shape[0], int((bot_col.shape[0] - bot_col.shape[1]) / 2)])),
1)
if bot_col.shape[1] % 2 == 1:
img_new = np.concatenate((np.zeros(
[bot_col.shape[0], int((bot_col.shape[0] - bot_col.shape[1] - 1) / 2)]), bot_col, np.zeros(
[bot_col.shape[0], int((bot_col.shape[0] - bot_col.shape[1] + 1) / 2)])), 1)
```
最后,将裁剪后的字符图片保存到文件中,并返回文件路径。
```python
cv.imwrite('fenge.jpg', img_new)
file_path = 'fenge.jpg'
return file_path
```
整个过程中使用的方法包括二值化、膨胀、轮廓检测和裁剪等,这些方法常用于字符图片的处理和识别。
import cv2 import numpy as np # 读取图像 img = cv2.imread('work8.tif', -1) #转为彩色图 img1 = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) # 转换为HSV hsv = cv2.cvtColor(img1, cv2.COLOR_BGR2HSV) # 设置颜色范围 lower_gray = np.array([0, 0, 100]) upper_gray = np.array([180, 50, 255]) # 创建掩膜 mask = cv2.inRange(hsv, lower_gray, upper_gray) # 去噪 kernel = np.ones((5, 5), np.uint8) opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) # 获取花 flower = cv2.bitwise_and(img, img, mask=opening) cv2.imshow("test", flower) # 着色 color = np.zeros_like(img) color[..., 0] = 255 color[..., 1] = 255 color[..., 2] = 0 # 将原始图像中需要着色的部分变为蓝色 result = img.copy() result[opening > 0] = color[opening > 0] # 显示结果 cv2.imshow('result', result) cv2.waitKey(0)
这段代码是使用OpenCV实现花着色的示例代码。下面是对代码的解释:
1. 使用cv2.imread函数读取输入图像work8.tif,并使用参数-1表示读取的是原始图像,包括alpha通道。
2. 将原始图像转换为彩色图像,因为后面需要用到颜色信息。
3. 将彩色图像转换为HSV颜色空间,方便对颜色进行筛选。
4. 设置颜色范围,这里设置了灰色的颜色范围,lower_gray表示下限颜色,upper_gray表示上限颜色。
5. 使用cv2.inRange函数根据颜色范围创建掩膜,将符合范围的像素设置为白色,不符合的设置为黑色。
6. 使用cv2.morphologyEx函数对掩膜进行去噪操作,这里采用了开运算操作,可以去除一些小的噪点。
7. 使用cv2.bitwise_and函数获取花的部分,将原始图像和掩膜做按位与操作,得到的结果就是花的部分。
8. 定义一个颜色数组color,将需要着色的部分变为蓝色,这里将蓝色通道设置为255,绿色通道设置为255,红色通道设置为0。
9. 复制原始图像img,将需要着色的部分按照掩膜进行着色,将值为1的部分设置为蓝色,其余部分保持不变。
10. 显示结果,使用cv2.imshow函数展示着色后的花图像和原始图像。使用cv2.waitKey函数等待用户按下任意键,关闭窗口。
需要注意的是,这段代码仅适用于特定的输入图像,对于其他图像可能需要调整颜色范围和去噪参数等。同时,这种方法只能将灰色的花朵着色为蓝色,对于其他颜色的花朵可能需要采用其他着色策略。