cv2 二值图片 0值 和 255值取反
时间: 2024-03-09 12:49:09 浏览: 18
可以使用cv2的bitwise_not函数对二值图像进行取反操作,将0值变成255值,将255值变成0值。
代码示例:
``` python
import cv2
# 读入二值图像
img = cv2.imread('binary_image.png', cv2.IMREAD_GRAYSCALE)
# 取反操作
result = cv2.bitwise_not(img)
# 显示结果
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
注意,如果原图像不是二值图像,而是灰度图像或彩色图像,需要先进行阈值分割操作将其转换成二值图像,再进行取反操作。
代码示例:
``` python
import cv2
# 读入灰度图像
img = cv2.imread('gray_image.png', cv2.IMREAD_GRAYSCALE)
# 阈值分割,将灰度图像转换成二值图像
ret, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 取反操作
result = cv2.bitwise_not(binary)
# 显示结果
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
同样,如果需要将取反后的二值图像还原成原图像,也可以使用bitwise_not函数进行操作。
相关问题
import cv2 import numpy as np def cvtBackground(path,color): """ 功能:给证件照更换背景色(常用背景色红、白、蓝) 输入参数:path:照片路径 color:背景色 """ im=cv2.imread(path) im_hsv=cv2.cvtColor(im,cv2.COLOR_BGR2HSV) #BGR和HSV的转换使用 cv2.COLOR_BGR2HSV #aim=np.uint8([[im[0,0,:]]]) #hsv_aim=cv2.cvtColor(aim,cv2.COLOR_BGR2HSV) mask=cv2.inRange(im_hsv,np.array([im_hsv[0,0,0]-0.1,100,100]),np.array([im_hsv[0,0,0]+0.1,255,255])) #利用cv2.inRange函数设阈值,去除背景部分 mask1=mask #在lower_red~upper_red之间的值变成255 img_median = cv2.medianBlur(mask,5) #自己加,中值滤波,去除一些边缘噪点 mask2 = img_median mask_inv=cv2.bitwise_not(mask2) img1=cv2.bitwise_and(im,im,mask=mask_inv) #将人物抠出 bg=im.copy() rows,cols,channels=im.shape bg[:rows,:cols,:]=color img2=cv2.bitwise_and(bg,bg,mask=mask2) #将背景底板抠出 img=cv2.add(img1,img2) #改变图片比例 h, w = img.shape[:2] img5 = cv2.resize(img, (int(w * 1/3), int(h * 1/3)), interpolation=cv2.INTER_LINEAR) image={'im':im,'im_hsv':im_hsv,'mask':mask1,'img_median':img_median,'img':img5} cv2.startWindowThread() #加了这个后在图片窗口按Esc就可以关闭图片窗口 for key in image: cv2.namedWindow(key) cv2.imshow(key,image[key]) cv2.waitKey(0) cv2.destroyAllWindows() return image #test if __name__=='__main__': img=cvtBackground('D:\picture\\rm.jpg',[255,255,255])这段代码涵盖的知识点
1. 导入模块(cv2和numpy)
2. 定义函数cvtBackground,实现证件照更换背景色的功能
3. 读取图片(cv2.imread)
4. 将BGR颜色空间转换为HSV颜色空间(cv2.cvtColor)
5. 设定阈值,去除背景部分(cv2.inRange)
6. 中值滤波,去除一些边缘噪点(cv2.medianBlur)
7. 图片取反(cv2.bitwise_not)
8. 与运算,将人物抠出(cv2.bitwise_and)
9. 创建背景底板,并将其与阈值后的照片进行与运算,将背景抠出(cv2.bitwise_and)
10. 将人物和背景合并(cv2.add)
11. 改变图片比例(cv2.resize)
12. 定义一个字典,包含处理过程中用到的所有图像
13. 创建窗口,并显示图像(cv2.namedWindow,cv2.imshow)
14. 等待按键按下,关闭窗口(cv2.waitKey,cv2.destroyAllWindows)
15. 在主函数中调用cvtBackground函数,测试代码功能
请查看下列代码并增加将print出来的图片复制到新文件夹中的代码import cv2 import os folder_path = './labels' list_big = [] for i in range(256): list_big.append([i, 0]) for picture in os.listdir(folder_path): image_gray = cv2.imread(os.path.join(folder_path, picture), 0) hist = cv2.calcHist([image_gray], [0], None, [256], [0, 256]) # 利用遍历操作对二维灰度图作取反操作 for j in range(256): list_big[j][1] += hist.tolist()[j][0] if hist.tolist()[18][0]>0: print(picture)
你可以使用以下代码将打印出来的图片复制到新文件夹中:
```python
import shutil
# 新文件夹路径
new_folder_path = './new_labels'
# 创建新文件夹
os.makedirs(new_folder_path, exist_ok=True)
for picture in os.listdir(folder_path):
image_gray = cv2.imread(os.path.join(folder_path, picture), 0)
hist = cv2.calcHist([image_gray], [0], None, [256], [0, 256])
for j in range(256):
list_big[j][1] += hist.tolist()[j][0]
if hist.tolist()[18][0] > 0:
print(picture)
# 复制图片到新文件夹
shutil.copy(os.path.join(folder_path, picture), os.path.join(new_folder_path, picture))
```
这段代码会在指定的目录 `./new_labels` 中创建一个新文件夹,并将满足条件的图片复制到该文件夹中。你可以根据需要修改 `new_folder_path` 的值来指定新文件夹的路径。