[CV2] HSV در مقابل RGB: درک و استفاده از HSV برای پردازش تصویر
![[CV2] HSV در مقابل RGB: درک و استفاده از HSV برای پردازش تصویر [CV2] HSV در مقابل RGB: درک و استفاده از HSV برای پردازش تصویر](https://nabfollower.com/blog/wp-content/uploads/2024/11/CV2-HSV-در-مقابل-RGB-درک-و-استفاده-از-HSV-780x470.png)
Summarize this content to 400 words in Persian Lang
در پست قبلی، اصول کار با تصاویر RGB در OpenCV از جمله ترسیم و تنظیم روشنایی و کنتراست را بررسی کردیم. در حالی که فضای رنگی RGB برای نمایشگرهای رایانه ایده آل است، زیرا رنگ ها را از نظر شدت نور ساطع شده از صفحه نمایش نشان می دهد، با نحوه درک انسان از رنگ ها در دنیای طبیعی همخوانی ندارد. اینجا جایی است که HSV (رنگ، اشباع، ارزش) وارد می شود – فضای رنگی طراحی شده برای نمایش رنگ ها به گونه ای که به درک انسان نزدیک تر است.در این پست، HSV را بررسی میکنیم، اجزای آن را درک میکنیم، کاربردهای آن را بررسی میکنیم و چند ترفند جالب برای بهبود تصاویر را یاد میگیریم.
HSV چیست؟
HSV مخفف Hue، Saturation و Value است:
Hue (H): این به نوع رنگ اشاره دارد – قرمز، سبز، آبی و غیره. در حالی که به طور سنتی بر حسب درجه در یک طیف دایره ای (0°-360°) اندازه گیری می شود، در OpenCV، Hue به 0-179 تا مقیاس بندی می شود. متناسب با یک عدد صحیح 8 بیتی این نقشه برداری است:
0 (یا نزدیک به آن) همچنان قرمز را نشان می دهد.
60-89 مربوط به سبز است.
120-149 مربوط به آبی است.
140-179 به رنگ قرمز در می آید و طیف دایره ای را تکمیل می کند.
اشباع (S): شدت یا خلوص یک رنگ را مشخص می کند: رنگ کاملاً اشباع شده خاکستری ندارد و پر جنب و جوش است، رنگ کمتر اشباع شده بیشتر شسته شده به نظر می رسد.
مقدار (V): اغلب به عنوان روشنایی از آن یاد می شود، روشنایی یا تاریکی را اندازه گیری می کند. رنگ
برای درک بهتر این موضوع، ضربه نمودار، نمایش خوبی از مقادیر موجود در فضای رنگی است
تبدیل تصویر به HSV در OpenCV
تبدیل یک تصویر به HSV در OpenCV با تابع ()cv2.cvtColor ساده است. بیایید نگاهی بیندازیم:
import cv2
import matplotlib.pyplot as plt
image = cv2.imread(‘./test.png’)
plt.figure(figsize=(10,10))
plt.subplot(1,2,1)
plt.imshow(image[:,:,::-1]) #plot as RGB
plt.title(“RGB View”)
hsv= cv2.cvtColor(image, cv2.COLOR_RGB2HSV)
plt.subplot(1,2,2)
plt.imshow(hsv)
plt.title(“HSV View”)
plt.tight_layout()
plt.show()
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
در نگاه اول، طرح HSV ممکن است عجیب به نظر برسد – تقریباً شبیه بیگانگان. این به این دلیل است که رایانه شما سعی می کند HSV را به عنوان یک تصویر RGB نشان دهد، حتی اگر اجزای HSV (به ویژه Hue) مستقیماً به مقادیر RGB نگاشت نشده باشند. به عنوان مثال:
Hue (H): که به عنوان یک زاویه نشان داده می شود، از 0 تا 179 در OpenCV متغیر است (نه از 0 تا 255 مانند کانال های RGB). این باعث می شود که کانال Hue در نمودارهای مبتنی بر RGB عمدتاً آبی ظاهر شود.
برای مثالهای بعدی، از تصویر نمایه استفاده نمیکنیم، بلکه از تصویر تیرهتر تولید شده با مدل Flux ai image gen استفاده میکنیم. به عنوان یک مورد کاربر بهتر از HSV از تصویر نمایه ارائه می دهد، زیرا ما می توانیم تأثیر آن را بهتر ببینیم
درک HSV از طریق هیستوگرام
برای درک بهتر تفاوت بین RGB و HSV، بیایید برای هر کانال هیستوگرام ترسیم کنیم. این هم کد:
# Plot the histograms
plt.figure(figsize=(10, 6))
# RGB Histogram
plt.subplot(1, 2, 1)
for i, color in enumerate([‘r’, ‘g’, ‘b’]):
plt.hist(image[:, :, i].ravel(), 256, [0, 256], color=color, histtype=’step’)
plt.xlim([0, 256])
plt.title(“RGB Histogram”)
# HSV Histogram
plt.subplot(1, 2, 2)
for i, color in enumerate([‘r’, ‘g’, ‘b’]):
plt.hist(hsv[:, :, i].ravel(), 256, [0, 256], color=color, histtype=’step’)
plt.xlim([0, 256])
plt.title(“HSV Histogram”)
plt.show()
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
از هیستوگرام ها، می توانید ببینید که چگونه کانال های HSV با RGB متفاوت است. به کانال Hue در HSV توجه کنید که دارای مقادیری بین 0 تا 179 است که مناطق رنگی متمایز را نشان می دهد، در حالی که Saturation و Value شدت و روشنایی را کنترل می کنند.
تجسم رنگ، اشباع و ارزش
حال، بیایید تصویر HSV را به اجزای جداگانه آن تقسیم کنیم تا بهتر بفهمیم هر کانال چه چیزی را نشان می دهد:
# Plot the individual HSV channels
plt.figure(figsize=(10, 6))
plt.subplot(1, 3, 1)
plt.imshow(hsv[:, :, 0], cmap=’hsv’) # Hue
plt.title(“Hue”)
plt.subplot(1, 3, 2)
plt.imshow(hsv[:, :, 1], cmap=’gray’) # Saturation
plt.title(“Saturation”)
plt.subplot(1, 3, 3)
plt.imshow(hsv[:, :, 2], cmap=’gray’) # Value
plt.title(“Value”)
plt.tight_layout()
plt.show()
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
Hue: تمایز رنگها را واضح نشان میدهد و رنگهای غالب در تصویر را برجسته میکند.
اشباع: نواحی روشنتر رنگهای پر جنب و جوش را نشان میدهند، در حالی که مناطق تیرهتر نشاندهنده رنگهای خاموشتر و مایل به خاکستری است.
مقدار: توزیع روشنایی را برجسته می کند، با مناطقی که به خوبی روشن شده اند، روشن تر به نظر می رسند.
ترفندهایی با HSV
1. افزایش روشنایی (برابرسازی ارزش)
برای تصاویر با نور ناهموار، یکسان کردن کانال Value میتواند نواحی تیرهتر را بیشتر نمایان کند و در عین حال به مناطق روشنتر جلوه «درخشش» بدهد.
equ = cv2.equalizeHist(hsv[:, :, 2]) # Equalize the Value channel
new_hsv = cv2.merge((hsv[:, :, 0], hsv[:, :, 1], equ))
new_image = cv2.cvtColor(new_hsv, cv2.COLOR_HSV2BGR)
# Display results
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.title(“Original Image”)
plt.subplot(1, 2, 2)
plt.imshow(new_image)
plt.title(“Brightness Enhanced”)
plt.tight_layout()
plt.show()
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
2. افزایش رنگ (تعادل اشباع)
تقویت کانال اشباع رنگ ها را در تصویر متمایزتر و زنده تر می کند.
equ = cv2.equalizeHist(hsv[:, :, 1]) # Equalize the Saturation channel
new_hsv = cv2.merge((hsv[:, :, 0], equ, hsv[:, :, 2]))
new_image = cv2.cvtColor(new_hsv, cv2.COLOR_HSV2BGR)
# Display results
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.title(“Original Image”)
plt.subplot(1, 2, 2)
plt.imshow(new_image)
plt.title(“Color Enhanced”)
plt.tight_layout()
plt.show()
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
3. فیلتر رنگ (جداسازی قرمز)
با استفاده از کانال Hue میتوانیم رنگهای خاصی را جدا کنیم. به عنوان مثال، برای استخراج تن های قرمز:
# Define range for red color
lower_red = np.array([140, 0, 0])
upper_red = np.array([180, 255, 255])
# Create a mask
mask = cv2.inRange(hsv, lower_red, upper_red)
filtered_image = cv2.bitwise_and(image, image, mask=mask)
# Display results
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.title(“Original Image”)
plt.subplot(1, 2, 2)
plt.imshow(filtered_image)
plt.title(“Red Filtered”)
plt.tight_layout()
plt.show()
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این تکنیک برای کارهایی مانند تشخیص اشیا، تقسیم بندی رنگ یا حتی جلوه های هنری بسیار مفید است.
نتیجه گیری
فضای رنگی HSV روشی همه کاره و بصری برای تجزیه و تحلیل و دستکاری تصاویر ارائه می دهد. HSV با جدا کردن رنگ (Hue)، شدت (Saturation) و روشنایی (Value)، کارهایی مانند فیلتر کردن رنگ، بهبود و تقسیم بندی را ساده می کند. در حالی که RGB برای نمایشگرها ایده آل است، HSV امکاناتی را برای پردازش تصویر خلاقانه و تحلیلی باز می کند.
ترفند مورد علاقه شما با HSV چیست؟ نظرات خود را در زیر به اشتراک بگذارید، و بیایید این دنیای پر جنب و جوش رنگ را با هم کشف کنیم!
این نسخه دارای یک جریان روان، توضیحات دقیق و قالب بندی ثابت برای بهبود خوانایی و درک مطلب است.
در پست قبلی، اصول کار با تصاویر RGB در OpenCV از جمله ترسیم و تنظیم روشنایی و کنتراست را بررسی کردیم. در حالی که فضای رنگی RGB برای نمایشگرهای رایانه ایده آل است، زیرا رنگ ها را از نظر شدت نور ساطع شده از صفحه نمایش نشان می دهد، با نحوه درک انسان از رنگ ها در دنیای طبیعی همخوانی ندارد. اینجا جایی است که HSV (رنگ، اشباع، ارزش) وارد می شود – فضای رنگی طراحی شده برای نمایش رنگ ها به گونه ای که به درک انسان نزدیک تر است.
در این پست، HSV را بررسی میکنیم، اجزای آن را درک میکنیم، کاربردهای آن را بررسی میکنیم و چند ترفند جالب برای بهبود تصاویر را یاد میگیریم.
HSV چیست؟
HSV مخفف Hue، Saturation و Value است:
- Hue (H): این به نوع رنگ اشاره دارد – قرمز، سبز، آبی و غیره. در حالی که به طور سنتی بر حسب درجه در یک طیف دایره ای (0°-360°) اندازه گیری می شود، در OpenCV، Hue به 0-179 تا مقیاس بندی می شود. متناسب با یک عدد صحیح 8 بیتی این نقشه برداری است:
- 0 (یا نزدیک به آن) همچنان قرمز را نشان می دهد.
- 60-89 مربوط به سبز است.
- 120-149 مربوط به آبی است.
- 140-179 به رنگ قرمز در می آید و طیف دایره ای را تکمیل می کند.
-
اشباع (S): شدت یا خلوص یک رنگ را مشخص می کند: رنگ کاملاً اشباع شده خاکستری ندارد و پر جنب و جوش است، رنگ کمتر اشباع شده بیشتر شسته شده به نظر می رسد.
-
مقدار (V): اغلب به عنوان روشنایی از آن یاد می شود، روشنایی یا تاریکی را اندازه گیری می کند. رنگ
برای درک بهتر این موضوع، ضربه نمودار، نمایش خوبی از مقادیر موجود در فضای رنگی است
تبدیل تصویر به HSV در OpenCV
تبدیل یک تصویر به HSV در OpenCV با تابع ()cv2.cvtColor ساده است. بیایید نگاهی بیندازیم:
import cv2
import matplotlib.pyplot as plt
image = cv2.imread('./test.png')
plt.figure(figsize=(10,10))
plt.subplot(1,2,1)
plt.imshow(image[:,:,::-1]) #plot as RGB
plt.title("RGB View")
hsv= cv2.cvtColor(image, cv2.COLOR_RGB2HSV)
plt.subplot(1,2,2)
plt.imshow(hsv)
plt.title("HSV View")
plt.tight_layout()
plt.show()
در نگاه اول، طرح HSV ممکن است عجیب به نظر برسد – تقریباً شبیه بیگانگان. این به این دلیل است که رایانه شما سعی می کند HSV را به عنوان یک تصویر RGB نشان دهد، حتی اگر اجزای HSV (به ویژه Hue) مستقیماً به مقادیر RGB نگاشت نشده باشند. به عنوان مثال:
- Hue (H): که به عنوان یک زاویه نشان داده می شود، از 0 تا 179 در OpenCV متغیر است (نه از 0 تا 255 مانند کانال های RGB). این باعث می شود که کانال Hue در نمودارهای مبتنی بر RGB عمدتاً آبی ظاهر شود.
برای مثالهای بعدی، از تصویر نمایه استفاده نمیکنیم، بلکه از تصویر تیرهتر تولید شده با مدل Flux ai image gen استفاده میکنیم. به عنوان یک مورد کاربر بهتر از HSV از تصویر نمایه ارائه می دهد، زیرا ما می توانیم تأثیر آن را بهتر ببینیم
درک HSV از طریق هیستوگرام
برای درک بهتر تفاوت بین RGB و HSV، بیایید برای هر کانال هیستوگرام ترسیم کنیم. این هم کد:
# Plot the histograms
plt.figure(figsize=(10, 6))
# RGB Histogram
plt.subplot(1, 2, 1)
for i, color in enumerate(['r', 'g', 'b']):
plt.hist(image[:, :, i].ravel(), 256, [0, 256], color=color, histtype='step')
plt.xlim([0, 256])
plt.title("RGB Histogram")
# HSV Histogram
plt.subplot(1, 2, 2)
for i, color in enumerate(['r', 'g', 'b']):
plt.hist(hsv[:, :, i].ravel(), 256, [0, 256], color=color, histtype='step')
plt.xlim([0, 256])
plt.title("HSV Histogram")
plt.show()
از هیستوگرام ها، می توانید ببینید که چگونه کانال های HSV با RGB متفاوت است. به کانال Hue در HSV توجه کنید که دارای مقادیری بین 0 تا 179 است که مناطق رنگی متمایز را نشان می دهد، در حالی که Saturation و Value شدت و روشنایی را کنترل می کنند.
تجسم رنگ، اشباع و ارزش
حال، بیایید تصویر HSV را به اجزای جداگانه آن تقسیم کنیم تا بهتر بفهمیم هر کانال چه چیزی را نشان می دهد:
# Plot the individual HSV channels
plt.figure(figsize=(10, 6))
plt.subplot(1, 3, 1)
plt.imshow(hsv[:, :, 0], cmap='hsv') # Hue
plt.title("Hue")
plt.subplot(1, 3, 2)
plt.imshow(hsv[:, :, 1], cmap='gray') # Saturation
plt.title("Saturation")
plt.subplot(1, 3, 3)
plt.imshow(hsv[:, :, 2], cmap='gray') # Value
plt.title("Value")
plt.tight_layout()
plt.show()
- Hue: تمایز رنگها را واضح نشان میدهد و رنگهای غالب در تصویر را برجسته میکند.
- اشباع: نواحی روشنتر رنگهای پر جنب و جوش را نشان میدهند، در حالی که مناطق تیرهتر نشاندهنده رنگهای خاموشتر و مایل به خاکستری است.
- مقدار: توزیع روشنایی را برجسته می کند، با مناطقی که به خوبی روشن شده اند، روشن تر به نظر می رسند.
ترفندهایی با HSV
1. افزایش روشنایی (برابرسازی ارزش)
برای تصاویر با نور ناهموار، یکسان کردن کانال Value میتواند نواحی تیرهتر را بیشتر نمایان کند و در عین حال به مناطق روشنتر جلوه «درخشش» بدهد.
equ = cv2.equalizeHist(hsv[:, :, 2]) # Equalize the Value channel
new_hsv = cv2.merge((hsv[:, :, 0], hsv[:, :, 1], equ))
new_image = cv2.cvtColor(new_hsv, cv2.COLOR_HSV2BGR)
# Display results
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.title("Original Image")
plt.subplot(1, 2, 2)
plt.imshow(new_image)
plt.title("Brightness Enhanced")
plt.tight_layout()
plt.show()
2. افزایش رنگ (تعادل اشباع)
تقویت کانال اشباع رنگ ها را در تصویر متمایزتر و زنده تر می کند.
equ = cv2.equalizeHist(hsv[:, :, 1]) # Equalize the Saturation channel
new_hsv = cv2.merge((hsv[:, :, 0], equ, hsv[:, :, 2]))
new_image = cv2.cvtColor(new_hsv, cv2.COLOR_HSV2BGR)
# Display results
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.title("Original Image")
plt.subplot(1, 2, 2)
plt.imshow(new_image)
plt.title("Color Enhanced")
plt.tight_layout()
plt.show()
3. فیلتر رنگ (جداسازی قرمز)
با استفاده از کانال Hue میتوانیم رنگهای خاصی را جدا کنیم. به عنوان مثال، برای استخراج تن های قرمز:
# Define range for red color
lower_red = np.array([140, 0, 0])
upper_red = np.array([180, 255, 255])
# Create a mask
mask = cv2.inRange(hsv, lower_red, upper_red)
filtered_image = cv2.bitwise_and(image, image, mask=mask)
# Display results
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.title("Original Image")
plt.subplot(1, 2, 2)
plt.imshow(filtered_image)
plt.title("Red Filtered")
plt.tight_layout()
plt.show()
این تکنیک برای کارهایی مانند تشخیص اشیا، تقسیم بندی رنگ یا حتی جلوه های هنری بسیار مفید است.
نتیجه گیری
فضای رنگی HSV روشی همه کاره و بصری برای تجزیه و تحلیل و دستکاری تصاویر ارائه می دهد. HSV با جدا کردن رنگ (Hue)، شدت (Saturation) و روشنایی (Value)، کارهایی مانند فیلتر کردن رنگ، بهبود و تقسیم بندی را ساده می کند. در حالی که RGB برای نمایشگرها ایده آل است، HSV امکاناتی را برای پردازش تصویر خلاقانه و تحلیلی باز می کند.
ترفند مورد علاقه شما با HSV چیست؟ نظرات خود را در زیر به اشتراک بگذارید، و بیایید این دنیای پر جنب و جوش رنگ را با هم کشف کنیم!
این نسخه دارای یک جریان روان، توضیحات دقیق و قالب بندی ثابت برای بهبود خوانایی و درک مطلب است.