我想找到显示器中存在的每个坏像素。坏像素可能是颜色不正确的像素,或者像素只是黑色。显示屏的尺寸为 160x320 像素。所以如果显示效果好的话,必须有160*320=51200像素。如果显示器没有 51200 像素,那就是坏的。另外,我想知道每个坏像素的位置。
一旦拍摄的图像太大,我将共享一个谷歌驱动器共享文件夹,其中包含良好显示器和包含坏像素的坏显示器的示例。
显示图像| ||你能帮我怎么做吗?我想用 opencv 在 python 中执行此操作。
提前感谢
我尝试通过检测到的对象的轮廓进行评估,它可以工作,但前提是所有像素都存在。如果一个像素丢失并且没有检测到轮廓,我可以知道一个像素丢失,但我无法知道它的位置。
所以我认为最好的解决方案是跟踪网格并评估每个像素网格的单元格。
这是我当前的代码:
Here is my current code:
import cv2
import numpy as np
import matplotlib.pyplot as plt
def getColor(area):
if area > 70:
return (255, 0, 0)
if area < 14:
return (0, 0, 255)
return (255, 255, 0)
def test_green_pattern():
mask = cv2.imread("masks/mask.bmp", 0)
green = cv2.imread("images/green-good.bmp")
green_W = cv2.addWeighted(green, 3, green, 0, 1)
gray = cv2.cvtColor(green_W, cv2.COLOR_BGR2GRAY)
masked = cv2.bitwise_and(gray, gray, mask=mask)
cv2.imwrite("try/green-masked.bmp", masked)
# Real threshold = 120
ret, thresh = cv2.threshold(masked, 120, 255, cv2.THRESH_BINARY)
cv2.imwrite("try/green-threshold.bmp", thresh)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
print("Green Pattern Pixels:", len(contours))
areas = []
perimeters = []
bad = 0
prob_double = 0
qtd = 0
for i, contour in enumerate(contours):
area = area = cv2.contourArea(contour)
areas.append(area)
perimeter = cv2.arcLength(contour,True)
perimeters.append(perimeter)
color = getColor(area)
if area < 14:
bad += 1
qtd += 1
x, y, width, height = cv2.boundingRect(contour)
roi = green[y:y+height, x:x+width]
cv2.imwrite("try/temp/"+str(i)+".bmp", roi)
cv2.drawContours(green, contour, -1, color, 1)
cv2.drawContours(green_W, contour, -1, color, 1)
if area > 90:
prob_double += 1
qtd += 2
cv2.drawContours(green, contour, -1, color, 1)
cv2.drawContours(green_W, contour, -1, color, 1)
else:
qtd += 1
#get_statistics(areas, perimeters)
print("Total:",qtd)
print("Probably double pixel:", prob_double)
print("Bad pixels:", bad)
cv2.imwrite("try/green-contours.bmp", green)
cv2.imwrite("try/green_w-contours.bmp", green_W)
test_green_pattern()
import cv2
import numpy as np
def check_display(image_path, grid_size=(160, 320)):
"""
检查显示屏是否存在坏像素。
Args:
image_path (str): 显示屏图像的路径。
grid_size (tuple): 显示屏的网格尺寸 (列数,行数)。
Returns:
tuple: 包含以下内容的元组:
- bad_pixels (list): 坏像素坐标的列表,格式为 [(x1, y1), (x2, y2), ...]。
- image_with_marks (ndarray): 标记了坏像素的图像。
"""
image = cv2.imread(image_path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (3, 3), 0) # 使用小内核的高斯模糊来减少噪点
thresh = cv2.threshold(blurred, 120, 255, cv2.THRESH_BINARY)[1]
# 根据网格尺寸计算每个单元格的宽度和高度
cell_width = image.shape[1] // grid_size[0]
cell_height = image.shape[0] // grid_size[1]
bad_pixels = []
for row in range(grid_size[1]):
for col in range(grid_size[0]):
# 提取单元格 ROI
x1 = col * cell_width
y1 = row * cell_height
x2 = x1 + cell_width
y2 = y1 + cell_height
cell = thresh[y1:y2, x1:x2]
# 检查单元格是否全黑或全白
if np.sum(cell) == 0 or np.sum(cell) == 255 * cell.shape[0] * cell.shape[1]:
bad_pixels.append((col, row))
# 在图像上标记坏像素(可选)
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 0, 255), 1)
return bad_pixels, image
# 使用示例
image_path = 'path_to_your_image.jpg' # 将其替换为的图像路径
bad_pixels, marked_image = check_display(image_path)
if bad_pixels:
print(f"发现 {len(bad_pixels)} 个坏像素:")
for pixel in bad_pixels:
print(f" - 列: {pixel[0]}, 行: {pixel[1]}")
cv2.imshow("坏像素", marked_image)
cv2.waitKey(0)
else:
print("未发现坏像素。")
说明:
-
网格检测:
该代码首先根据提供的
grid_size
计算网格。然后,它会遍历每个单元格(网格交点之间的区域)并分析其内容。 - 阈值化: 对图像进行阈值化以创建二值图像,其中亮像素表示可能的像素,而暗像素表示背景或坏像素。
- 单元格分析: 对于每个单元格,代码都会检查它是否主要包含黑色或白色像素。如果满足此条件,则该单元格将被标记为可能包含坏像素。
- 坏像素标记: 然后,该代码将在原始图像上标记检测到的坏像素,以便于可视化。
使用方法:
-
替换
image_path
为的图像文件路径。 -
调整
grid_size
以匹配的显示分辨率。 - 运行代码。
该代码将在的显示器图像上显示标记的坏像素,并在控制台中打印出它们的坐标。
注意:
- 此代码假定提供的图像是均匀照明的显示屏图像。
- 阈值和模糊参数可能需要根据的特定图像进行调整以获得最佳结果。