如何使用cv2将图片偶数行第10个、奇数行第11个像素改为红色
问题修正与实现方案
原代码错误点
- 直接遍历
resized_img得到的row是当前行的像素值数组,不是行索引,无法用来判断行的奇偶性 row.all() % 2 == 0逻辑错误:row.all()的返回值是布尔值,仅用来判断行内所有像素值是否都非0,不能用来做行奇偶性判断resized_img[:,row + 11]是对所有行的指定列统一赋值,不符合分奇偶行处理的需求
正确实现代码
import cv2 import matplotlib.pyplot as plt # read image image = cv2.imread('2161382.jpg') im_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # resize image resized_img = cv2.resize(im_rgb,(500,500)) img_width = resized_img.shape[1] img_height = resized_img.shape[0] # 遍历每一行的索引y for y in range(img_height): if y % 2 == 0: # 偶数行(索引从0开始计数),每第10个像素赋值红色,要从1开始数第10个的话改为 resized_img[y, 9::10] 即可 resized_img[y, ::10] = (255,0,0) else: # 奇数行,每第11个像素赋值红色,要从1开始计数的话改为 resized_img[y, 10::11] resized_img[y, ::11] = (255,0,0) %matplotlib notebook plt.figure(figsize=(10,10)) plt.imshow(resized_img)
上述实现用了numpy步长索引,比逐像素循环执行效率高很多,可根据自己的计数需求调整偏移量适配不同的计数起点。
内容的提问来源于stack exchange,提问作者Nino
相关产品推荐
相关产品推荐

