Python3使用OpenCV实现图像最大颜色块的判别和图像边缘分割与提取

该博客介绍了如何使用Python3和OpenCV进行图像处理,包括最大颜色块的判断、边缘分割与提取。通过读取图像、比较像素颜色并进行颜色归一化,找到主导颜色,并将非主导颜色区域设置为白色。接着,应用膨胀和腐蚀操作进行边缘检测,最终输出处理后的图像,展示了颜色区块提取和轮廓分割的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        Python3使用OpenCV实现图像最大颜色块的判别和图像边缘分割与提取。使用的方法简单朴素,调用OpenCV的同时,自己写了个图像最大颜色区块的相似判别,最后输出该图像。

代码如下:

import cv2
import numpy as np

color_mofang = []

image_1 = cv2.imread("G:\\videos\\mofang.jpeg")

#image_2 = image_1

a,b,c = image_1.shape

print(a,b,c)
s = ""
for i in range(a):
    for j in range(b):
        s = ""
        if(image_1[i,j,0]<=225 and image_1[i,j,1]<=225 and image_1[i,j,2]<=225):
         if(image_1[i,j,0]>=45 and image_1[i,j,1]>=45 and image_1[i,j,2]>=45):
        #    color_mofang.append(str(image_1[i,j,0])+str(image_1[i,j,1])+str(image_1[i,j,2]))
                if(abs(image_1[i,j,0]-image_1[i,j,1])>=45 and abs(image_1[i,j,2]-image_1[i,j,1])>=45 and abs(image_1[i,j,2]-image_1[i,j,0])>=45):
                    for k in range(3):
                     image_1[i,j,k] = int(image_1[i,j,k]/2)*2
                     if(image_1[i,j,k]<10):
                        s = s + "00" + str(image_1[i,j,k])
                     elif (image_1[i,j,k]<100): 
                        s = s + "0" + str(image_1[i,j,k])
                     else:
                        s = s + str(image_1[i,j,k])    
                    color_mofang.append(s)

color_mofang_2 = []

for x in color_mofang:
    if(x not in color_mofang_2):
        color_mofang_2.append(x)

d = []
for x in color_mofang_2:
    d.append(color_mofang.count(x))

max_color = max(d)

i = d.index(max_color)

#print(d)

print(color_mofang_2[i])

aa = int(color_mofang_2[i][0:2])
bb = int(color_mofang_2[i][3:5])
cc = int(color_mofang_2[i][6:8])

for i in range(a):
    for j in range(b):

      if(not(image_1[i,j,0]<=225 and image_1[i,j,1]<=225 and image_1[i,j,2]<=225)):
           for k in range(3):
            image_1[i,j,k]=255 
            

      if(not(image_1[i,j,0]>=25 and image_1[i,j,1]>=25 and image_1[i,j,2]>=25)):
           for k in range(3):
            image_1[i,j,k]=255         

     #flag2 = image_1[i,j,0]>=105 or image_1[i,j,1]>=105 or image_1[i,j,2]>=105 
     #flag2 = True  
     #if(not((abs(image_1[i,j,0]-image_1[i,j,1])>=45) and abs(image_1[i,j,2]-image_1[i,j,1])>=45 and abs(image_1[i,j,2]-image_1[i,j,0])>=45) and flag2): 
      #flag = image_1[i,j,0]>=105 and image_1[i,j,1]>=105 and image_1[i,j,2]>=105
      flag = True  
      if((abs(image_1[i,j,0]-aa)<6 and abs(image_1[i,j,1]-bb)<6 and abs(image_1[i,j,2]-cc)<6) or not flag):
    #    if(not(image_1[i,j,0]==cc and image_1[i,j,1]==bb and image_1[i,j,2]==aa) or (not flag)):
    #   if(not(image_1[i,j,0]==aa and image_1[i,j,1]==bb and image_1[i,j,2]==cc)):        
          for k in range(3):
            image_1[i,j,k]=255            

cv2.imshow("final_image",image_1)
cv2.waitKey(0)
cv2.imwrite("G:\\videos\\mofang2.jpeg",image_1)

filename="G:\\videos\\mofang2.jpeg"
img = cv2.imread(filename,0)
print(np.shape(img))
kernel = np.ones((3,3),np.uint8)
dilate = cv2.dilate(img,kernel,iterations = 1)
# 显示图片
# ## 效果展示
# cv2.imshow('origin', img)
 
 
cv2.imwrite('G:\\videos\\lishuwang_dilate.jpg',dilate)
# erosion = cv2.erode(img,kernel,iterations = 1)
# cv2.imwrite('lishuwang_erosion.jpg',erosion)
 
canny1=cv2.Canny(dilate,100,200)
cv2.imwrite('G:\\videos\\lishuwang_canny.jpg',canny1)
 
# kernel2 = np.ones((2,1),np.uint8)
# erosion = cv2.erode(canny,kernel2,iterations = 1)
# cv2.imwrite('lishuwang_erosion.jpg',erosion)
 
_, labels, stats, centroids = cv2.connectedComponentsWithStats(canny1)
print(centroids)
print("stats",stats)
i=0
for istat in stats:
    if istat[4]<2:
        #print(i)
        print(istat[0:2])
        if istat[3]>istat[4]:
            r=istat[3]
        else:r=istat[4]
        cv2.rectangle(canny1,tuple(istat[0:2]),tuple(istat[0:2]+istat[2:4]) , 0,thickness=-1)  # 26
    i=i+1
 
 
cv2.imwrite('G:\\videos\\lishuwang_canny1.jpg',canny1)

cv2.imshow("final_image",canny1)
cv2.waitKey(0)
cv2.imwrite("G:\\videos\\mofang3.jpeg",canny1)

效果如下:

 

 

 颜色区块提取和轮廓分割效果如下:

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值